2011-08-24 22 views
10

Tôi nhận được stack trace này khi tôi triển khai ứng dụng Hibernate tôicreateEntityManager ném java.lang.NullPointerException tại org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus

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] 

Nó được chạm NPE trong lớp HibernateUtil của tôi, dòng 53 là một dòng tạo ra một EntityManager - có vẻ như hàm createEntityManager() trả về một giá trị rỗng. Mã này trông giống như

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

static { 
    try { 

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

persistence.xml tôi trông như thế

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

ý tưởng Bất kỳ lý do tại sao createEntityManager() đưa ra các NPE?

Trả lời

13

Stacktrace cho biết rõ ràng rằng Hibernate không thể tham gia giao dịch JTA. Hơn nữa, sự kết hợp của <jta-data-source>Persistence.createEntityManagerFactory() trông lạ - JTA có khả năng EntityManager thường được tạo bởi máy chủ ứng dụng và thu được từ nó thông qua JNDI.

Nếu bạn thực sự muốn sử dụng giao dịch tài nguyên cục bộ thay vì JTA, bạn cần khai báo <non-jta-data-source> để thay thế.

+0

Tôi đánh giá cao nó - lời khuyên của bạn cho phép tôi làm việc thông qua lỗi này. Cảm ơn bạn! – user619804

+1

Làm thế nào đến điều này làm việc trong tất cả các phiên bản JBoss <= 6? Chúng tôi có cùng một kết hợp ở đây và nó không thành công kể từ khi chúng tôi triển khai nó để JBoss 7.0.1. –

+0

Dường như là một lỗi trong Hibernate 4.0.0.Beta. Một báo cáo lỗi đã được gửi ở đây: https://hibernate.onjira.com/browse/HHH-6522 –

30

Nếu bạn đang sử dụng Hibernate 4 và cố gắng để tạo ra một EntityManagerFactory bằng tay (hoặc SessionFactory) khai báo là <jta-datasource>, có một tài sản mà bạn phải đặt trên của bạn persistence.xml gọi hibernate.transaction.jta.platform. Để sử dụng trên JBoss 7

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

tôi tìm thấy về khách sạn này tại Hibernate Docs

+1

Nice !! điều này giải quyết cùng một lỗi cho tôi. Tôi đã sử dụng cách thực hiện 'JBossStandAloneJtaPlatform'. Các giá trị có thể được hiển thị ở đây dưới 'Lớp con được biết trực tiếp:': https://docs.jboss.org/hibernate/orm/4.2/javadocs/org/hibernate/service/jta/platform/internal/AbstractJtaPlatform.html –

Các vấn đề liên quan