hibernate - Transacciones manuales con Sejo POJO
jpa transactions (2)
La forma en que estoy trabajando actualmente es así:
//don''t use @Transactional annotation
public void doStuff() {
UserTransaction userTx = (UserTransaction) org.jboss.seam.Component.getInstance("org.jboss.seam.transaction.transaction");
userTx.setTransactionTimeout(10 * 60); //set timeout to 60 * 10 = 600 secs = 10 mins
userTx.begin();
/*If entity manager is created before the transaction is started (ie. via Injection) then it must join the transaction */
entityManager.joinTransaction();
//do stuff
entityManager.persist(user);
entityManager.flush(); //logs will show an insert at this point
userTx.commit(); //or rollback()
}
Pero si una Transacción ya está en progreso y desea unirse, entonces usa el usuarioTx.isActive (), etc.
¿Cuál es la mejor práctica para usar transacciones de base de datos con Seam cuando no se utilizan EJB, es decir. al desplegar Seam como WAR?
Por defecto, Seam JavaBeans admite Transacciones. Puedo anotar un método con @Transactional y eso asegurará que se requiera una transacción. O puedo usar @Transactional (NUNCA) o @Transactional (OBLIGATORIO). Lo que no puedo averiguar es cómo crear mi propia transacción, establecer un tiempo de espera, comenzar y luego confirmar / revertir.
He intentado usar:
UserTransaction utx = Transaction.instance();
utx.setTransactionTimeout(2000);
utx.begin();
Pero se ignora si una Transacción ya está en progreso o devuelve una javax.transaction.NotSupportedException si anoto el método con @Transactional (NUNCA)
Cualquier ayuda apreciada. Gracias.
Como saben, Transaction Management es una preocupación transversal. Por lo tanto, no es una buena idea que su código esté diseminado en módulos donde esas preocupaciones no son su principal preocupación.
Si está utilizando una UserTransaction de JTA en un entorno que no es de EJB, entonces JTA está disponible (Apache Tomcat no es compatible con JTA).
1 ° regla
La gestión de transacciones de Seam está habilitada de forma predeterminada para todas las solicitudes JSF (Seam 2.0+).
Creo que la administración de transacciones de Seam suena mejor que las Transacciones administradas por Seam . Significa que Seam se preocupa, detrás de las escenas, de llamar a comenzar y comprometerse. Seam juega el papel de administrador de transacciones mediante el uso de un administrador de transacciones de costura
1 ° escenario : POJO + JTA disponible (Apache Tomcat no es compatible con JTA)
Transaction Manager utilizado por Seam: org.jboss.seam.transaction.UTtransaction
Habilitado por defecto en entorno no EJB (guerra) cuando JTA está disponible (JBoss admite JTA)
Si está utilizando JPA EntityManager o Hibernate Session, necesita registrarlos para permitir a Seam administrar los límites de las transacciones
Ver 9.3. Contextos de persistencia administrados por costura cómo configurar un contexto de persistencia administrado Seam (Inyectado usando @In)
A continuación, inserte EntityManager (EntityManager) o Session (Hibernate) con @In (ámbito de ScopeType.CONVERSATION)
@Name("businessService")
public class BusinessServiceImpl implementes BusinessService {
@In
private EntityManager entityManager;
public void doSomething() {
// You do not need to call entityManager().getTransaction().begin();
// because Seam Transaction Manager takes care of it
// By using proxies
// Therefore, if you call entityManager().getTransaction().begin()
// You will get IllegalStateException
// Some EntityManager operations persist, find etc
// You do not need to call entityManager().getTransaction().commit();
// because Seam Transaction Manager takes care of it
// By using proxies
}
}
Detrás de escena, Seam Transaction Manager alista EntityManager (JPA) o Session (Hibernate) en el UserTransaction JTA activo, llamando al método joinTransaction
2 ° escenario : POJO + RESOURCE_LOCAL (Hibernate o JPA) Transacción
Administrador de transacciones utilizado por Seam (JPA): org.jboss.seam.transaction.EntityTransaction
Transaction Manager utilizado por Seam (Hibernate): org.jboss.seam.transaction.HibernateTransaction
Ver 9.3. Contextos de persistencia administrados por costura cómo configurar un contexto de persistencia administrado Seam (Inyectado usando @In)
Detrás de escena, Seam Transaction Manager se encarga de llamar a begin y commit en la tecnología subyacente mediante el uso de proxies
3 ° escenario : EJB
Transaction Manager utilizado por Seam: org.jboss.seam.transaction.CMTTransaction
Habilitado por defecto en el entorno EJB. Tenga cuidado, en ese caso, Seam no controla las transacciones gestionadas por contenedores.
Saludos,