hibernate jpa transactions seam

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,