通过Persistence.createEntityManagerFactory找不到JPA entityMangerFactory(" XYZ")

时间:2015-06-05 13:24:02

标签: spring hibernate jpa

非常感谢任何帮助。

我们正在开发一个Web应用程序。它使用JAR文件(java maven项目),并已作为maven依赖项添加到Web应用程序中。 此JAR文件和Web应用程序本身的组合会产生问题。

Web应用程序和JAR都使用Hibernate JPA与数据库进行交互。但两者都使用两种不同的方式来创建/初始化entityManagerFactory。

Web应用程序使用基于Spring xml的配置来初始化entityManagerFactory。

CODE: persistence.xml代码:

<persistence-unit name="org.jbpm.persistence.jpa.local"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <mapping-file>META-INF/JBPMorm-JPA2.xml</mapping-file>
        <class>org.drools.persistence.info.SessionInfo</class>
        <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
        <class>org.drools.persistence.info.WorkItemInfo</class>     
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="hibernate.max_fetch_depth" value="3" />         
            <property name="hibernate.show_sql" value="true" />         
        </properties>
    </persistence-unit>

弹簧配置:     

    <context:component-scan base-package="com.company.rd.core" />
    <context:component-scan base-package="com.company.rd.services" />

    <jee:jndi-lookup id="testDataSource" jndi-name="java:comp/env/jdbc/SybaseDB" />

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="testDataSource"/>
        <property name="defaultTimeout" value="120"></property>
    </bean>
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="org.jbpm.persistence.jpa.local" />
        <property name="dataSource" ref="testDataSource" />
        <property name="jpaDialect" ref="jpaDialect" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
    </bean>
    <bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    <bean id="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
        <property name="jpaDialect" ref = "jpaDialect"></property>
        <property name="defaultTimeout" value="120"></property>
    </bean>

    <jee:jndi-lookup id="logDataSource" jndi-name="java:comp/env/jdbc/DRMLOG" />
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

</beans> 

以下是在JAR文件中初始化entitymanagerFactory的代码。

的persistence.xml

<persistence-unit name="codeAuthorization" transaction-type="RESOURCE_LOCAL">
      <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <non-jta-data-source>java:/comp/env/jdbc/SybaseDB</non-jta-data-source>
      <class>com.company.auth.entity.AuthorizationCode</class>
      <class>com.company.auth.entity.UserInvalidAttempt</class>
      <class>com.company.auth.entity.AuthorizationProperty</class>
        <properties>            
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>

一个通过spring注入Base DAO的java文件。

@Service
public class AuthorizationEntityMangerService {
    @PersistenceUnit(name = "codeAuthorization")
    private EntityManagerFactory entityManagerFactory;
    public AuthorizationEntityMangerService() {
        entityManagerFactory = Persistence
                .createEntityManagerFactory("org.jbpm.persistence.jpa.local");
    }
    public EntityManagerFactory getEntityManagerFactory() {
        return entityManagerFactory;
    }
    public EntityManager getEntityManager() {
        return this.entityManagerFactory.createEntityManager();
    }
    public void closeEntityManager(EntityManager entityManager) {
        if (entityManager != null && entityManager.isOpen()) {
            entityManager.close();
        }
    }
    public EntityTransaction getTransaction(EntityManager entityManager) {
        return entityManager.getTransaction();
    }
    public void rollBackTransaction(EntityTransaction transaction) {
        if (transaction != null && transaction.isActive()) {
            transaction.rollback();
        }
    }
    public void commitTransaction(EntityTransaction transaction) {
        if (transaction != null && transaction.isActive()) {
            transaction.commit();
        }
    }
}

从Base DAO调用代码。

public Object getSingleResult(final String queryString, final String key,
            final NamedQueryParameter namedQueryParameter) {
        EntityTransaction transaction = null;
        EntityManager entityManager = null;
        try {
            entityManager = this.entityMangerService.getEntityManager();
            transaction = entityMangerService.getTransaction(entityManager);
            transaction.begin();
            final Query query = entityManager.createQuery(queryString);
            setQueryParameter(query, namedQueryParameter);
            final Object result = query.getSingleResult();
            entityMangerService.commitTransaction(transaction);
            return result;
        } catch (final NoResultException e) {
            entityMangerService.rollBackTransaction(transaction);
            logger.error("Error" : " + e.getMessage());
            return null;
        } finally {
            entityMangerService.closeEntityManager(entityManager);
        }
    }

现在这是问题什么时候行entityManager.createQuery(queryString);执行它会抛出异常。


2015-06-05 17:39:46,363  WARN DefaultExceptionHandler:94 - Unhandled exception caught by the Stripes default 

exception handler.
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: AuthorizationProperty is 

not mapped [SELECT pe.value FROM AuthorizationProperty pe WHERE pe.name=:propertyName AND pe.deleted=0]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1364)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke

(ExtendedEntityManagerCreator.java:334)
    at com.sun.proxy.$Proxy53.createQuery(Unknown Source)
    at com.company.authentication.dao.AuthorizationBaseDAO.getSingleResult(AuthorizationBaseDAO.java:40)
    at com.company.authentication.dao.PropertyDAOImlp.getPropertyValue(PropertyDAOImlp.java:22)
    at com.company.authentication.services.AuthorizationPropertyService.getPropertyValueByName

(AuthorizationPropertyService.java:19)
    at com.company.rd.servlet.JspAuthorizationRestFilter.hasAuthorizationCode

(JspAuthorizationRestFilter.java:105)
    at com.company.rd.servlet.AbstractAuthorizationRestFilter.isRequestAuthenticated

(AbstractAuthorizationRestFilter.java:120)
    at com.company.rd.servlet.JspAuthorizationRestFilter.doFilter(JspAuthorizationRestFilter.java:84)


我调试了代码并找到了persistenceUnit&#34; codeAuthorization&#34;的entityManagerFactory。未初始化。只有&#34; org.jbpm.persistence.jpa.local&#34;在此方法中可用(通过eclipse调试器验证)。

注意:此JAR在其他一些应用程序中运行良好,其中Web应用程序和JAR使用相同的方式初始化entityMangerFactory [通过Persistence.createEntityManagerFactory(&#34;&#34;)]。

请告诉我如何获得&#34; codeAuthorization&#34; entiryManagerFactory

1 个答案:

答案 0 :(得分:0)

你正在使用Spring然后使用Spring,目前你正在做很多工作来解决Spring和依赖注入和托管事务。不要使用Persistence.createEntityManagerFactory("")。只需使用EntityManager注释的EntityManager字段将@PersistenceContext注入所需位置,然后指定所需字段的名称即可。

也不管理交易,实体经理自己,春天为你做。为此,请使用PlatformTransactionManager JpaTransactionManager而不是DatasourceTransactionManager,因为它不适用于JPA环境。 (至少不管理你的JPA交易)。

这样做会真正简化您的代码和生活。

所以基本上放弃了做那些令人讨厌的事情的服务,简单地做了这样的事情。

@Repository
public class YourDao {

    @PersistenceContext(name="codeAuthorization")
    private EntityManager em;

    @Transactional
    public Object getSingleResult(final String queryString, final String key,
        final NamedQueryParameter namedQueryParameter) {

        final Query query = em.createQuery(queryString);
        setQueryParameter(query, namedQueryParameter);
        return query.getSingleResult();
    }

}

在您的配置中,将DatasourceTransactionManager替换为JpaTransactionManager并添加<tx:annotation-driven />。然后清理你的代码。

注意:JpaTransactionManager完全能够管理纯JDBC事务,如果您仍然需要这些事务,理想情况下您将拥有一个事务管理器。

相关问题