2016-02-19 68 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的設置,我已經有了一些東西。

它只是證明上次安裝到服務器的應用程序有問題。因此,我卸載了應用程序並從頭開始安裝。 它使事情正確。