2016-04-13 6 views
0

Ich arbeite an einer Klasse, die ein Unternehmen Manager in meinen dao Klassen injiziert aber ich, wenn ich den EntityManager schließe, kann ich es nicht wieder öffnenSo öffnen Sie einen Entity Manager nach einem close(); JAVA EE

Dies ist die Klasse

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(); 
} 
} 

Ich habe versucht eM.getTransaction(). Begin(); aber es wirft diese Ausnahme:

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

Ihr Code sagt Ihnen, wie man einen EntityManager erstellt _eM = eMF.createEntityManager(); _ –

+0

Ich möchte nicht jedes Mal einen Entity Manager erstellen, wenn ich eine Transaktion machen möchte, sondern ich möchte nur einen erstellen und öffnen es vor einer Transaktion und schließen Sie es danach. –

+0

erstellen ein EM ist ein EM öffnen! –

Antwort

0

In einer JavaEE Umgebung, die Sie nicht RESOURCE_LOCAL, aber JTA verwenden sollten. Sie können den EntityManager mit @PersistenceContext injizieren und da EJBs bereits transaktional sind, müssen Sie nicht committen, schließen ect.

Für einen RESOURCE_LOCAL EntityManager wie in obigem Beispiel können Sie einen geschlossenen EntityManager nicht erneut verwenden, sondern müssen einen neuen EntityManager erstellen, indem Sie die Factory verwenden.