ich versuche, zweimal zu öffnen Transaktion ein EntityManager mit:Kann nicht Transaktion EntityManger mit wieder öffnen
EntityManagerFactory emf = Persistence.createEntityManagerFactory("HelloWorldPU");
EntityManager em = emf.createEntityManager();
Message message0 = new Message();
message0.setText("Hi!!");
em.getTransaction().begin();
em.persist(message0);
em.getTransaction().commit();
em.close();
Message message1 = new Message();
message1.setText("Bye!!");
System.out.println("i'm here");
em.getTransaction().begin();
em.persist(message1);
em.getTransaction().commit();
em.close();
und eine Ausnahme erhalten:
i
Exception in thread hier bin " main "java.lang.IllegalStateException: or[email protected]31e4bb2020 ist geschlossen
Meine Vermutung ist: Es ist nicht möglich, eine andere Transaktion aus dem geschlossenen EntityManager zu bekommen. Allerdings JPA Spec sagt:
EntityManager.close
Methode ein Unternehmen Manager Kontext und andere Ressourcen freizugeben, seine Beharrlichkeit schließt. Nach dem Aufruf vonclose
darf die Anwendung keine weiteren Methoden auf derEntityManager
Instanz außergetTransaction
undisOpen
aufrufen, oder dieIllegalStateException
wird geworfen. Wenn die Methodeclose
aufgerufen wird, wenn eine Transaktion aktiv ist, bleibt der Persistenzkontext bis zum Abschluss der Transaktion bestehen.
Könnte jemand erklären, wo ich falsch liege? gibt es keine Möglichkeit zum Aufruf getTransaction
bedeuten, dass ich diese Transaktion und ivoke Transaktion Methoden verwenden kann?
Vielen Dank.
UPDATE
Danke für die Antworten, sind diese sehr hilfreich für mich:
1:
Sie die EntityManager verwenden können, bis Sie in der Nähe nennen, ja. Es gibt keine "reopen" Methode. einen EntityManager zu schaffen, ist ein billiger Betrieb - Neil 13 Minuten Stockton vor
2:
Sie getTransaction anrufen um zu überprüfen, ob eine Transaktion aktiv ist. Yu könnte auch einen EntityManager mit einem aktiven TX schließen (wie der Docs-Status ) und nach dem Schließen commit). Daher die Tatsache, dass Sie getTransaction aufrufen können. - M. Deinum 9 Minuten vor
Die Dokumente sind ziemlich klar .... * Die Anwendung darf keine weiteren Methoden in der EntityManager-Instanz aufrufen außer getTransaction und isOpen, * ... Sie versuchen, etwas mit einem geschlossenen Entity-Manager beizubehalten, was nicht der Fall ist dürfen. Sie sollten den Entity Manager nur einmal kurz aufrufen. –
ok, aber was ich nicht verstehen kann, warum kann ich getTransaction aufrufen und dann nicht verwenden? –
Warum würden Sie den EntityManager schließen und dann versuchen, irgendeine Methode darauf aufzurufen ?! geschweige denn versuchen, es später wieder zu schließen! –