JPA: Eine Frage über entityManager.joinTransaction
Lassen Sie uns sagen, wir erklären eine application-managed entity-manager wie folgt (eine ähnliche version zu finden unter: http://download.oracle.com/docs/cd/E19798-01/821-1841/bnbqy/index.html):
@PersistenceUnit EntityManagerFactory emf;
@Resource UserTransaction utx;
protected void doPost(HttpServletRquest req,...)
em = emf.createEntityManager();
try {
utx.begin(); //(1)
em.persist(SomeEntity);
utx.commit();
} catch (Exception e) {
utx.rollback();
}
Während der code funktioniert, es gibt mehrere Folien aus SONNE Architekten (e.g: http://www.scribd.com/doc/6616366/TS49452007JavaEE) Stand, dass der block buggy und "em.joinTransaction()" sollte Hinzugefügt werden, nachdem die Zeile (1) (slide #50).
Wenn Ausnahmen vorkommen, persistenten Kontext werden inkonsistent und wir schließen Sie einfach das em, so Was können potenzielle Fehler(s) hier?
Irgendwelche Vorschläge, wo ich bin fehlt, sind wirklich geschätzt. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, der code, den du zeigst ist der buggy von einem JTA-Perspektive.
Müssen Sie sagen, die EM, die Sie wollen, dass es Teil einer verteilten Transaktion durch Aufruf von em.joinTransaction(). Wenn Sie nicht anrufen, die Methode, die der Benutzer Transaktion und der EM-Transaktion abgebrochen wird. Die javadocs der Methode Status:
Können Sie auch sehen auch, dass die EM nicht brauchen, um eine Transaktion zu starten, wenn Sie anrufen, em.joinTransaction. Wenn Sie nicht in einer JTA-Umgebung, dann würden Sie benötigen, rufen Sie em.getTransaction().begin() und em.getTransaction.commit(), aber da Sie sich in einer JTA-Transaktion, die UserTransaction ist verantwortlich für Start, commit oder Rollback.
Über die zweite Frage, ist es kein problem mit dem code, den du da hast, als wenn es eine Ausnahme, du bist nicht aufrufen der EM überhaupt. ABER, wenn es eine Ausnahme, die einzige Methode Sie können (und sollten) nennen, ist em.schließen(). Wenn Sie versuchen, etwas anderes zu tun, z.B. call-em.find(), die EM wirft einen InvalidStateException.
Ich hoffe das was ich geschrieben habe ist klar... JTA ist ein Komplexes monster.
Ich denke, das problem mit dem obigen code ist, dass manchmal es funktioniert nicht. Während es hat funktioniert in meiner Testversion (ich habe versucht, mit Glassfish/EclipseLink), kann es nicht funktionieren, in anderen Fällen (z.B.: http://netbeans.org/bugzilla/show_bug.cgi?id=90031).
Eine Sache, die mir fehlte (und beantwortet wurde von @Augusto) ist durch die Verwendung von "em.joinTransaction", wir nicht nur Fragen, "persistent context" erstellt von em war der gleiche wie utx, aber auch für die Registrierung von em zu utx, so dass, wenn utx.Begehen, em flush Inhalt zu db.
Ich bin glücklich mit dem, @Augusto Antwort, aber da ich kann mich nicht einloggen, um das Konto erstellt, die Frage konnte ich nicht klicken Sie auf die Schaltfläche "akzeptieren"; das tut uns Leid.