2016-04-13 6 views
0

私は私のDAOクラス でエンティティマネージャを注入クラスに取り組んでいるが、私はエンティティマネージャを閉じたとき、私は私がこれはクラスclose()の後にエンティティマネージャを開く方法。 JAVA EEは

public class EMinjector { 

public static EntityManagerFactory eMF; 
public static EntityManager eM; 

static { 
    eMF = Persistence.createEntityManagerFactory("persistenceUnit"); 
    eM = eMF.createEntityManager(); 
} 

public static EntityManager getEM(){ 
    if (eM.getTransaction().isActive()==false) 
     //here where I want to open eM 
    return eM; 
} 

public static void closeEM() { 
    eM.getTransaction().commit(); 
    eM.close(); 
} 
} 
ある

再びそれを開くことができません

私はeM.getTransaction()を試しました。begin();

Stacktraces 

java.lang.IllegalStateException: EntityManager is closed 
org.hibernate.jpa.internal.EntityManagerImpl.checkOpen(EntityManagerImpl.java:97) 
org.hibernate.jpa.internal.EntityManagerImpl.checkOpen(EntityManagerImpl.java:88) 
org.hibernate.jpa.internal.EntityManagerImpl.getSession(EntityManagerImpl.java:103) 
org.hibernate.jpa.internal.TransactionImpl.getSession(TransactionImpl.java:35) 
org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:45) 
com.iticsys.GBO.dao.EMinjector.getEM(EMinjector.java:21) 

// line 21 is where I pointed before 
+0

あなたのコードは、EntityManagerの作成方法を教えてくれます_eM = eMF.createEntityManager(); _ –

+0

トランザクションを実行するたびにエンティティマネージャを作成するのではなく、ただ作成して開きたいそれはトランザクションの前にそれを閉じてください。 –

+0

EMを作成していますEMを開いています! –

答えて

0

のJavaEE環境で使用すると、RESOURCE_LOCALが、JTAを使うべきではありません:それは、このexeptionをスローします。 @PersistenceContextでEntityManagerをインジェクトすることができます。また、EJBはすでにトランザクショナルなので、コミットする必要はありません。

上記の例のようなRESOURCE_LOCAL EntityManagerでは、閉じたEntityManagerを再利用することはできませんが、ファクトリを使用して新しいEntityManagerを作成する必要があります。

関連する問題