EJB sont des composants transactionnels. La transaction peut être gérée soit par le serveur applicaiton lui-même (CMT - transaction gérée par conteneur), soit manuellement par vous-même dans l'EJB (BMT - transaction gérée par bean).
EJB prend en charge la transaction distribuée par la spécification JTA. La transaction distribuée est contrôlé en utilisant UserTransaction
, qui possède des méthodes begin
, commit
, rollback
. Avec CMT, le serveur d'applications démarre, valide et annule la transaction (selon le code transaction annotations) pour vous et vous n'êtes pas autorisé à interférer. Cela signifie que vous ne devez pas accéder au UserTransaction
dans ce cas. Cependant, avec BMT, vous le faites manuellement et vous contrôlez la transaction vous-même en utilisant le UserTransaction
.
Passons maintenant à la EntityManager
. Une implémentation JPA peut être utilisée dans un serveur d'applications ou autonome. Si vous l'utilisez en mode autonome, vous devez utiliser EntityManage.getTransaction
pour délimiter vous-même la transaction JDBC. S'il est utilisé dans un serveur d'applications, le EntityManager
a coopéré de manière transparente avec le gestionnaire de transactions distribué JTA pour vous.
La plupart du temps, vous utilisez CMT avec @Required
annotation sur l'EJB. Cela signifie que vous n'avez pas besoin d'accéder à UserTransaction
ni EntityManager.getTransaction
. L'application. le serveur démarre et valide la transaction, mais prend également soin de revenir en arrière si une exception est déclenchée. C'est ce que je recommanderais pour votre façade.
(Il existe d'autres subtilités, telles que PersistenceContextType
ou l'inscription manuelle du gestionnaire d'entités dans une transaction distribuée avec EntityManager.joinTransaction
, mais uniquement si vous utilisez les technologies de manière différente par défaut).
Un bon article pour avoir une meilleure idée sur les transactions EJB, OMI, un must http://entjavastuff.blogspot.com/2011/02/ejb-transaction-management-going-deeper.html – thirdy