12

I'm getting this stack trace when I deploy my hibernate app

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]

It is hitting a NPE in my HibernateUtil class, line 53 is a line that creates an EntityManager - it looks like createEntityManager() is returning a null. The code looks like

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

static {
    try {

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

My persistence.xml looks like

<?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>

Any ideas why createEntityManager() giving the NPE?

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
user619804
  • 2,286
  • 12
  • 46
  • 71

2 Answers2

33

If you're using Hibernate 4 and trying to create a EntityManagerFactory manually (or SessionFactory) declared as <jta-datasource>, there is a property you must set on your persistence.xml called hibernate.transaction.jta.platform. For using on JBoss 7

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

I found about this property at Hibernate Docs

André
  • 2,184
  • 1
  • 22
  • 30
  • 1
    Nice!! this solved the same error for me. I alternatively used the `JBossStandAloneJtaPlatform` implementation. The possible values are shown here under `Direct Known Subclasses:`: https://docs.jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/service/jta/platform/internal/AbstractJtaPlatform.html – SkyWalker Jan 01 '15 at 13:35
15

Stacktrace clearly indicates that Hibernate cannot join JTA transaction. Moreover, comination of <jta-data-source> and Persistence.createEntityManagerFactory() looks strange - JTA-capable EntityManager is usually created by application server and obtained from it via JNDI.

If you actually want to use resource-local transactions rather than JTA, you need to declare <non-jta-data-source> instead.

axtavt
  • 239,438
  • 41
  • 511
  • 482
  • I appreciate it - your advice allowed me to work through this error. Thank you! – user619804 Aug 24 '11 at 21:08
  • 2
    How come this worked in all JBoss versions <= 6? We have the same combination here and it fails since we deployed it to JBoss 7.0.1. – Sebastian Wramba Sep 26 '11 at 08:59
  • Seems to be a bug in the Hibernate 4.0.0.Beta. A bug report was filed here: https://hibernate.onjira.com/browse/HHH-6522 – Sebastian Wramba Sep 26 '11 at 11:19
  • Has anybody tried with the latest nightly builds? I'm still seeing this problem with the build from last night (21.11.2011) – Juha Palomäki Nov 21 '11 at 08:23
  • FWIW JTA and createEntityManagerFactory is a "reasonable" thing to do ... you can use stand alone JTA providers in JavaSE. Sure it isn't the most common use case, but still valid – Neil Stockton Nov 20 '15 at 09:54