EJB son componentes transaccionales. La transacción puede ser gestionada por el propio servidor de aplicación (CMT - transacción gestionada por contenedor), o manualmente por usted mismo dentro del EJB (BMT - transacción gestionada por bean).
EJB admite transacciones distribuidas a través de la especificación JTA. La transacción distribuida se controla utilizando UserTransaction
, que tiene los métodos begin
, commit
, rollback
.
Con CMT, el servidor de aplicaciones inicia, compromete y retrotrae la transacción (según el transaction annotations) para usted y no puede interferir. Esto significa que no debe acceder al UserTransaction
en este caso. Sin embargo, con BMT, usted hace eso manualmente y usted mismo controla la transacción usando el UserTransaction
.
Pasemos ahora al EntityManager
. Una implementación de JPA se puede usar dentro de un servidor de aplicaciones o independiente. Si se usa en forma independiente, debe usar EntityManage.getTransaction
para delimitar la transacción JDBC usted mismo. Si se usa dentro de un servidor de aplicaciones, el EntityManager
cooperó con el administrador de transacciones distribuido JTA de forma transparente para usted.
La mayoría de las veces, utiliza CMT con la anotación @Required
en el EJB. Esto significa que no necesita acceder ni al UserTransaction
ni al EntityManager.getTransaction
. La aplicación. el servidor inicia y confirma la transacción, pero también se encarga de deshacer si se produce una excepción. Esto es lo que recomendaría para su fachada.
(hay más sutilezas, como el PersistenceContextType
o el alistamiento Manual del gestor de la entidad en una transacción distribuida con EntityManager.joinTransaction
, pero eso es sólo si utiliza las tecnologías de diferentes maneras como el valor por defecto).
Un buen artículo para tener una mejor idea acerca de Transacciones EJB, IMO, una lectura obligada http://entjavastuff.blogspot.com/2011/02/ejb-transaction-management-going-deeper.html – thirdy