2016-02-19 65 views
0

我简直无法从ProfileDBUtil注入EntityManagerFactory对象到ProfileManager类中,我实际上应用事务来查找数据库中的条目,或者更新一行等等。JPA createEntityManager NPE JtaStatusHelper.getStatus

createEntityManager()方法抛出在条目结尾处指定的异常。

奇怪的是,同一段代码适用于UAT环境,而SIT环境却失败。两种环境的所有配置都相同。类加载器顺序,共享库引用,模块类加载器是相同的。 这两种环境在其文件系统中都有必要的jar,并且似乎在运行时成功加载。

这个问题的根本原因是什么?

public class ProfileDBUtil { 


    private static final String PERSISTENCE_UNIT = "com.profile.userdb"; 

    public boolean loadProfile(String memberID) { 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT); 
     ProfileManager upm = new ProfileManager(emf); 
     List <Profile> ProfileList = upm.searchProfile(memberID); 
    } 
    } 

    @SuppressWarnings("unchecked") 
    @JPAManager(targetEntity = com.profile.userdb.model.Profile.class) 
    public class ProfileManager { 


    private EntityManagerFactory emf; 

    public ProfileManager() { 

    } 
    public ProfileManager(EntityManagerFactory emf) { 
     this.emf = emf; 
    } 

    public void setEntityManagerFactory(EntityManagerFactory emf) { 
     this.emf = emf; 
    } 

    private EntityManager getEntityManager() { 
     if (emf == null) { 
     throw new RuntimeException("The EntityManagerFactory is null. This must be passed in to the constructor``"); 
     } 
     return emf.createEntityManager(); // THIS FAILS 
    } 

    } 

Log trace;

at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:73) 
    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:115) 
    at org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.java:149) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:1207) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:176) 
    at org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.java:89) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:125) 

回答

0

尼尔的编辑; “JtaStatusHelper是一个HIBERNATE课程!”为我敲响了钟。我去检查emf的道具如下:

Map<String, Object> prop = emf.getProperties(); 
logger.debug("emf props : " + prop.toString()); 

并观察了SIT和UAT环境之间的差异。 基本的区别在于openjpa在SIT的任何按键中都不可用,而它在UAT的所有地方都是可用的。 SIT的配置以某种方式变成了休眠相关的行。不过,根据JPA的设置,我已经有了一些东西。

它只是证明上次安装到服务器的应用程序有问题。因此,我卸载了应用程序并从头开始安装。 它使事情正确。