@PersistenceUnit EntityManagerFactory未初始化/仍为null

时间:2016-01-15 11:48:39

标签: java ejb jboss6.x persistence.xml

我有一个Web应用程序,我试图在JBOSS EAP 6 App Server中运行。我试图将EntityManagerFactory注入我的Singleton Bean。

@Singleton
@Startup
public class RestServerConfigurator {
private static RestServerConfigurator instance;


@PersistenceUnit(unitName = "clinicalTrialsEntityManager")
private EntityManagerFactory emf;

public RestServerConfigurator() {
    if (emf == null) {
        System.out.println("You're null.");
    }
    else {
        System.out.println("Yay! Not null!");
    }
}

在某种程度上,我知道正在评估PersistenceUnit注释。如果我尝试给它一个除了我的persistence.xml中提到的unitName以外的unitName,那么当我尝试部署应用程序时,JBOSS服务器会抱怨。

相关的persistence.xml结构。

   <persistence-unit name="clinicalTrialsEntityManager" transaction-type="RESOURCE_LOCAL">
      <jta-data-source>java:jboss/datasources/ClinicalTrialsDS</jta-data-source>

从各方面来看,似乎“emf”变量从未被初始化,即使它成功部署,只要尝试使用EntityManagerFactory,就会抛出空指针。

我甚至创建了一个Singleton StartUp Bean来初始化EntityManagerFactory,也许这就是我所缺少的东西,它会以某种方式将它们联系在一起,但无济于事。请告诉我我缺少的内容,或者是否需要更多信息。

此外,如果有人能够解释当使用注释/注入方法时,EntityManagerFactory如何“假定”在幕后进行初始化,那将是最受欢迎的。我对EJB概念很陌生,并且无法理解它。

10:00:10,348 INFO  [org.jboss.as.jpa] (ServerService Thread Pool -- 135) JBAS011402: Starting Persistence Unit Service 'clinicalTrials.war#clinicalTrialsEntityManager'
10:00:10,348 INFO  [org.hibernate.ejb.Ejb3Configuration] (ServerService Thread Pool -- 135) HHH000204: Processing PersistenceUnitInfo [
    name: clinicalTrialsEntityManager
    ...]
10:00:10,371 INFO  [org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator] (ServerService Thread Pool -- 135) HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
10:00:10,411 INFO  [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 135) HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect

记录输出以验证Bean已初始化:

13:53:36,132 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-10) JNDI bindings for session bean named RestServerConfigurator in deployment unit deployment "clinicalTrials.war" are as follows:

java:global/clinicalTrials/RestServerConfigurator!edu.emory.clinical.trials.webapp.server.rest.RestServerConfigurator
java:app/clinicalTrials/RestServerConfigurator!edu.emory.clinical.trials.webapp.server.rest.RestServerConfigurator
java:module/RestServerConfigurator!edu.emory.clinical.trials.webapp.server.rest.RestServerConfigurator
java:global/clinicalTrials/RestServerConfigurator
java:app/clinicalTrials/RestServerConfigurator
java:module/RestServerConfigurator

2 个答案:

答案 0 :(得分:0)

我拔掉了Jersey实现并依赖JBoss的紧耦合RESTEasy模块,解决了依赖注入无法正常运行或按预期运行(特别是在我的Rest服务类中)的所有问题。

为了得出这个结论,我使用了他们的example apps(特别是helloworld-rs和hibernate4)并从那里进行逆向工程。

我找到了一个article关于扩展AbstractBinder并在我的应用程序中注册它,但它似乎更容易(并且需要更少的代码)我的目的是删除Jersey和我最初的所有手动“排除”RESTEasy配置在阅读this文章之后做了。

答案 1 :(得分:0)

通过EntityTransaction API由应用程序控制其事务的实体管理器是资源本地实体管理器。通过持久性提供程序将resource-local实体管理器事务映射到资源上的资源事务。资源本地实体管理器可以使用服务器或本地资源连接到数据库,并且不知道可能存在或可能不活动的JTA事务。

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">

    <persistence-unit name="ShopPU" transaction-type="RESOURCE_LOCAL">
        ...
    </persistence-unit>
</persistence>

使用以下代码

创建EntityManager引用
EntityManagerFactory emf = Persistence.createEntityManagerFactory("Order");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();

        ...

        em.getTransaction().commit();

        em.close();
        emf.close ();