【问题标题】:createEntityManager throws java.lang.NullPointerException at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatuscreateEntityManager 在 org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus 处抛出 java.lang.NullPointerException
【发布时间】:2011-08-24 20:13:08
【问题描述】:

我在部署休眠应用程序时收到此堆栈跟踪

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?

【问题讨论】:

    标签: hibernate jpa nullpointerexception entitymanager


    【解决方案1】:

    如果您使用 Hibernate 4 并尝试手动创建一个声明为 &lt;jta-datasource&gt;EntityManagerFactory(或 SessionFactory),则必须在 persistence.xml 上设置一个名为 hibernate.transaction.jta.platform 的属性。 在 JBoss 7 上使用

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

    我在Hibernate Docs找到了关于这个属性的信息

    【讨论】:

    【解决方案2】:

    Stacktrace 明确指出 Hibernate 不能加入 JTA 事务。此外,&lt;jta-data-source&gt;Persistence.createEntityManagerFactory() 的组合看起来很奇怪 - 支持 JTA 的EntityManager 通常由应用程序服务器创建并通过 JNDI 从中获取。

    如果您真的想使用资源本地事务而不是 JTA,则需要声明 &lt;non-jta-data-source&gt;

    【讨论】:

    • 我很感激 - 您的建议让我能够解决这个错误。谢谢!
    • 为什么这在所有 JBoss 版本
    • 似乎是 Hibernate 4.0.0.Beta 中的一个错误。此处提交了错误报告:hibernate.onjira.com/browse/HHH-6522
    • 有人试过最新的夜间版本吗?从昨晚(21.11.2011)开始,我仍然看到这个问题
    • FWIW JTA 和 createEntityManagerFactory 是一件“合理”的事情……您可以在 JavaSE 中使用独立的 JTA 提供程序。当然这不是最常见的用例,但仍然有效
    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2020-03-07
    相关资源
    最近更新 更多