2010-03-25 1 views
26

Kann jemand erklären, was ist der Unterschied zwischen:Was ist der Unterschied zwischen @Resource und Usertransaction EntityManager.getTransaction()

@Resource 
UserTransaction objUserTransaction; 

und

EntityManager.getTransaction(); 

Und auch, was Container verwaltet Transaktion? und wie soll ich es in meiner Sitzungsfassade machen, wenn ich drei Zeilen in eine Tabelle in der Transaktion einfügen möchte.

+1

Ein guter Artikel, um eine bessere Idee über EJB Transactions, IMO, ein Muss zu lesen http://entjavastuff.blogspot.com/2011/02/ejb-transaction-management-going-deeper.html – thirdy

Antwort

26

EJB sind Transaktionskomponenten. Die Transaktion kann entweder vom Anwendungsserver selbst (CMT - Container-Managed-Transaktion) oder manuell von Ihnen selbst innerhalb der EJB (BMT - Bean-Managed-Transaktion) verwaltet werden.

EJB unterstützt verteilte Transaktionen über die JTA-Spezifikation. Die verteilte Transaktion wird unter Verwendung von UserTransaction gesteuert, die über die Methoden begin, commit, rollback verfügt.

Mit CMT startet der Anwendungsserver die Transaktion (gemäß der transaction annotations) für Sie, Commit und Rollback, und Sie dürfen nicht stören. Dies bedeutet, dass Sie in diesem Fall nicht auf UserTransaction zugreifen müssen. Mit BMT machen Sie das manuell, und Sie steuern die Transaktion selbst unter Verwendung der UserTransaction.

Lassen Sie uns jetzt auf die EntityManager verschieben. Eine JPA-Implementierung kann entweder innerhalb eines Anwendungsservers oder eigenständig verwendet werden. Wenn Sie eine eigenständige Anwendung verwenden, müssen Sie EntityManage.getTransaction verwenden, um die JDBC-Transaktion selbst abzugrenzen. Bei Verwendung innerhalb eines Anwendungsservers hat die EntityManager mit dem verteilten Transaktionsmanager von JTA transparent für Sie zusammengearbeitet.

Die meiste Zeit verwenden Sie CMT mit @Required Annotation auf dem EJB. Das bedeutet, dass Sie weder auf UserTransaction noch auf EntityManager.getTransaction zugreifen müssen. Die App. Der Server startet und bestätigt die Transaktion, kümmert sich jedoch auch um ein Rollback, wenn eine Ausnahme ausgelöst wird. Das würde ich für Ihre Fassade empfehlen.

(Es gibt mehr Feinheiten, wie die PersistenceContextType oder die manuelle Eintragung des Entity Manager in verteilten Transaktionen mit EntityManager.joinTransaction, aber das ist nur, wenn Sie die Technologien auf andere Weise als Standard verwenden).

+3

Sind Sie sicher, dass 'EntityManager # getTransaction()' kooperiert mit der verteilten JTA-Transaktion, wenn sie innerhalb eines Anwendungsservers ausgeführt wird? Ich glaube nicht, dass dies der Fall ist. Nach meinem Verständnis gibt es eine resource-lokale Transaktion zurück, mit der Daten * außerhalb * der aktuellen JTA-Transaktion beibehalten werden können. –

+0

@Pascal Der 'EntityManager' arbeitet mit JTA zusammen, Sie sollten also 'EntityManager # getTransaction' überhaupt nicht verwenden. Wie beim Javadoc, wirft 'EntityManager # getTransaction '' IllegalStateException', wenn es auf einem JTA EntityManager aufgerufen wird. – ewernli

+2

"getTransaction" löst tatsächlich eine Ausnahme aus, wenn sie auf einem JTA EntityManager aufgerufen wird. Das Beispiel, das ich im Sinn hatte (aus "Pro JPA 2"), besteht darin, eine anwendungsverwaltete, ressourcenlokale EM in einer Session Bean zu erhalten - z. für die Audit-Protokollierung - und eine lokale Ressourcentransaktion, mit der Sie so oft wie gewünscht außerhalb der JTA-Transaktion beginnen/committen können. Aber ich merke, dass ich deine Antwort falsch gelesen habe, das ist anders als das, was du geschrieben hast. Vielen Dank! –

7

UserTransaction bezieht sich auf die JTA Transaktion Entität. Sie können diese Option nur verwenden, wenn ein JTA-Modul auf dem Anwendungsserver verfügbar ist. Wenn Sie beispielsweise eine Anwendung auf Tomcat bereitstellen (die JTA standardmäßig nicht unterstützt), schlägt der darauf basierende Code fehl . Dies ist der Standardtransaktionstyp, der in EJBs und MDBs verwendet wird.

EntityManager.getTransaction() ruft eine lokale Transaktionseinheit ab. Dies wird manchmal auch als lokale Ressourcentransaktion bezeichnet.

Lokale Ressourcentransaktionen unterscheiden sich erheblich von JTA-Transaktionen: Lokale Ressourcentransaktionen sind unter anderem für eine Ressource spezifisch, während JTA-Transaktionen für einen bestimmten Thread spezifisch sind.

Weitere Informationen über den Unterschied zwischen Ressourcen lokalen und JTA-Transaktionen finden diese Stackoverflow hier beantworten: What is the difference between a JTA and a local transaction?

0

Neben @ Marco Antwort, die gut tut, dem Unterschied zwischen dem JTA zu erzählen und lokale Transaktionen Ressourcen.

Containerverwaltete Transaktionen werden [wie es heißt] vom Container und nicht von Ihrer Anwendung verwaltet. Dies geschieht über die EJB-Ebene, in der Sie nur Ihre Methode schreiben müssen und der Container die Methode um einen Transaktionskontext wickelt. Wenn also ein Teil Ihrer Methode oder der Aufrufe auf niedrigerer Ebene eine Ausnahme auslöst, wird die Transaktion zurückgesetzt.

Es kann auch mit Anmerkungen verfeinert werden. Weitere Informationen finden Sie hier https://docs.oracle.com/javaee/5/tutorial/doc/bncij.html

Beachten Sie, dass dies nur über EJBs erfolgt und Entitätsmanager, die in die Webschicht injiziert werden (z. B. Servlets oder REST-API), werden nicht vom Container verwaltet Suchen Sie die Transaktion mit @Resource UserTransaction oder EntityManager.getTransaction, begin() und commit() selbst nach.

Von Java EE 6 aus können Sie EJBs innerhalb der Webschicht haben, so dass Sie kein übermäßig komplexes Projektlayout benötigen, wenn Sie nicht möchten, dass Ihre EJBs als Webdienste verfügbar gemacht werden.

+0

Im EE-Container sind verwaltete Transaktionen außerhalb von EJB über die Annotation "@Transactional" verfügbar. –

+0

JTA-Transaktionen sind * nicht * notwendigerweise CMT, da JTA außerhalb von Anwendungsservern (oder "Containern") mit Bibliotheken wie Bitronix und Atomikos verwendet werden kann. – Marco

Verwandte Themen