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).
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