Was ist der Unterschied zwischen @Resource UserTransaction und EntityManager.getTransaction()
Kann jemand erklären, was ist der Unterschied zwischen :
@Resource
UserTransaction objUserTransaction;
und
EntityManager.getTransaction();
Ist, und was ist container-verwaltete Transaktion? und wie sollte ich es tun, in meine session-Fassade, wenn ich Sie einfügen möchten drei Zeilen in der Tabelle in der Transaktion.
InformationsquelleAutor der Frage TCM | 2010-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
EJB sind transaktionale Komponenten. Die Transaktion verwaltet werden können, entweder durch die Anwendung server selbst (CMT - container-managed transaction) oder manuell durch sich selbst innerhalb der EJB - (BMT - bean-managed transaction).
EJB unterstützt die verteilte Transaktion durch die JTA-Spezifikation. Die verteilte Transaktion erfolgt über
UserTransaction
die die Methodenbegin
commit
rollback
.Mit CMT, der application server startet, commit und rollback der Transaktion (nach der Transaktion Anmerkungen) für Sie und Sie sind nicht erlaubt zu stören. Das heißt, Sie müssen nicht auf die
UserTransaction
in diesem Fall. Allerdings mit BMT, tun Sie das manuell und kontrollieren Sie die Transaktion selbst mitUserTransaction
.Kommen wir nun zu den
EntityManager
. Eine JPA-Implementierung kann verwendet werden, entweder innerhalb einer application server oder stand-alone. Wenn im stand-alone verwenden, benötigen SieEntityManage.getTransaction
zur Abgrenzung des JDBC Transaktion selbst. Wenn Sie innerhalb einer Anwendung-server, dieEntityManager
gemeinsam mit der JTA distributed transaction manager transparent für Sie.Meisten der Zeit, die Sie verwenden, CMT, mit
@Required
annotation auf die EJB. Dies bedeutet, dass Sie nicht brauchen, um Zugang wederUserTransaction
nochEntityManager.getTransaction
. Die app. server startet und die Transaktion ein commit ausgeführt, sondern sorgt auch für den ein rollback ausgeführt, wenn eine Ausnahme ausgelöst wird. Dies ist, was ich empfehlen würde, Ihre Fassade.(Es gibt weitere Feinheiten, wie die
PersistenceContextType
oder die manuelle Eintragung der entity-manager in verteilten Transaktion mitEntityManager.joinTransaction
aber nur, wenn Sie verwenden die Technologien, die in einer anderen Weise als die Standard).InformationsquelleAutor der Antwort ewernli
UserTransaction
bezieht sich auf die JTA Transaktion Person. Sie werden nur in der Lage, zu verwenden, wenn es eine JTA-Modul in der Anwendung verfügbar server: zum Beispiel, wenn Sie die Bereitstellung einer Anwendung mit Tomcat (die standardmäßig nicht unterstützt JTA), code unter Berufung auf das scheitern wird. Dies ist die standardmäßige Art der Transaktion EJB 's und MDB' s aus.EntityManager.getTransaction()
ruft eine lokalen Transaktion Person. Diese manchmal auch bekannt als eine Ressource der lokalen Transaktion.Ressource lokale Transaktionen sind sehr Verschieden von JTA-Transaktionen: unter anderem, Ressourcen-lokale Transaktionen einer Ressource, in der Erwägung, dass JTA-Transaktionen tendenziell auf einen bestimmten thread.
Weitere Informationen über den Unterschied zwischen Ressourcen der lokalen und JTA-Transaktionen, siehe diese stackoverflow-Antwort hier: Was ist der Unterschied zwischen einer JTA und eine lokale Transaktion?
InformationsquelleAutor der Antwort Marco
Zusätzlich zu @Marco ' s Antwort, die nicht gut zu sagen, der Unterschied zwischen der JTA und Ressourcen lokale Transaktionen.
Container-Verwalteten Transaktionen sind [wie es heißt] verwaltet die container, anstatt Ihre Anwendung. Dies erfolgt durch den EJB-tier, wo Sie brauchen nur zu schreiben, Ihre Methode und der container wird wickeln Sie die Methode, um eine Transaktion Kontext, also wenn ein Teil Ihrer Methode oder die untere Ebene fordert, löst eine Ausnahme aus, die Transaktion wird rollback.
Kann es auch sein, fein abgestimmt mit Anmerkungen. Mehr info finden Sie hier https://docs.oracle.com/javaee/5/tutorial/doc/bncij.html
Beachten Sie, dass dies nur geschieht durch EJBs entity-Managern, die injiziert werden auf dem web-tier (z.B. servlets oder REST-API) nicht bekommen, verwaltet der container, in dem Fall Sie zu schauen, bis Sie die Transaktion über
@Resource UserTransaction
oderEntityManager.getTransaction
begin()
undcommit()
selbst.Vom Java EE 6-Sie sind erlaubt, um EJBs innerhalb der web-tier, so dass Sie nicht brauchen, um eine übermäßig komplexe layout des Projektes, es sei denn, Sie starten zu wollen, setzen Sie Ihre EJBs als web-services.
InformationsquelleAutor der Antwort Archimedes Trajano