web-dev-qa-db-ja.com

createEntityManagerはorg.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatusでJava.lang.NullPointerExceptionをスローします

休止状態のアプリをデプロイすると、このスタックトレースが取得されます

Java.lang.NullPointerException
    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.Java:72) [hibernate-core-4.0.0.Beta1.jar:4.0.0.Beta1]
    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.Java:114) [hibernate-core-4.0.0.Beta1.jar:4.0.0.Beta1]
    at org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.Java:149) [hibernate-core-4.0.0.Beta1.jar:4.0.0.Beta1]
    at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.Java:1197) [hibernate-entitymanager-4.0.0.Beta1.jar:4.0.0.Beta1]
    at org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.Java:170) [hibernate-entitymanager-4.0.0.Beta1.jar:4.0.0.Beta1]
    at org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.Java:90) [hibernate-entitymanager-4.0.0.Beta1.jar:4.0.0.Beta1]
    at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.Java:112) [hibernate-entitymanager-4.0.0.Beta1.jar:4.0.0.Beta1]
    at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.Java:107) [hibernate-entitymanager-4.0.0.Beta1.jar:4.0.0.Beta1]
    at com.mycompany.myapp.common.persistence.HibernateUtil.<clinit>(HibernateUtil.Java:53) [classes:]
    at com.mycompany.myapp.common.businessobjects.ServerSettings.GetServerSettings(ServerSettings.Java:247) [classes:]
    at com.mycompany.myapp.common.servlet.SecurityFilter.init(SecurityFilter.Java:55) [classes:]
    at org.Apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.Java:447) [jbossweb-7.0.0.CR4.jar:7.0.0.Final]
    at org.Apache.catalina.core.StandardContext.filterStart(StandardContext.Java:3245) [jbossweb-7.0.0.CR4.jar:7.0.0.Final]
    at org.Apache.catalina.core.StandardContext.start(StandardContext.Java:3836) [jbossweb-7.0.0.CR4.jar:7.0.0.Final]
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.Java:70) [jboss-as-web-7.0.0.Final.jar:7.0.0.Final]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.Java:1765)
    at org.jboss.msc.service.ServiceControllerImpl$ClearTCCLTask.run(ServiceControllerImpl.Java:2291)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.Java:886) [:1.6.0_26]
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:908) [:1.6.0_26]
    at Java.lang.Thread.run(Thread.Java:680) [:1.6.0_26]

HibernateUtilクラスのNPEにヒットしています。53行目はEntityManagerを作成する行です。createEntityManager()がnullを返しているようです。コードは次のようになります

private static EntityManagerFactory entityManagerFactory = null;
private static EntityManager entityManager = null;

static {
    try {

        entityManagerFactory = Persistence.createEntityManagerFactory("primary");
        entityManager = entityManagerFactory.createEntityManager();

私のpersistence.xmlは次のようになります

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd"> <persistence-unit name="primary"> <jta-data-source>Java:jboss/datasources/MySqlDS</jta-data-source>

  <properties>
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
     <property name="hibernate.ejb.interceptor.session_scoped" value="com.mycompany.myapp.common.persistence.BusinessObjectInterceptor"/>
           </properties>

CreateEntityManager()がNPEを提供する理由はありますか?

13
user619804

Stacktraceは、HibernateがJTAトランザクションに参加できないことを明確に示しています。さらに、_<jta-data-source>_とPersistence.createEntityManagerFactory()の組み合わせは奇妙に見えます-JTA対応のEntityManagerは通常、アプリケーションサーバーによって作成され、JNDIを介して取得されます。

JTAではなくリソースローカルトランザクションを実際に使用する場合は、代わりに_<non-jta-data-source>_を宣言する必要があります。

15
axtavt

Hibernate 4を使用していて、<jta-datasource>として宣言されたEntityManagerFactoryを手動(またはSessionFactory)で作成しようとしている場合は、persistence.xmlに設定する必要のあるプロパティがあります。 hibernate.transaction.jta.platformと呼ばれます。 JBoss7で使用する場合

<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />

このプロパティについて Hibernate Docs で見つけました

32
André