2009-11-24 18 views
6

¿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?Transacciones manuales con costura POJO

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 es ignorado si una transacción ya está en progreso o devuelve un javax.transaction.NotSupportedException si anoto el método con @Transactional (NUNCA)

Cualquier ayuda apreciada. Gracias.

+0

dan el nombre completo de @Transactional – Bozho

+0

org.jboss.seam.annotations.Transactional – Damo

Respuesta

8

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 JTA en un entorno que no es EJB, entonces JTA está disponible (Apache Tomcat no es compatible con JTA).

1 ° regla

gestión de transacciones costura está activada por defecto para todas las peticiones JSF (Seam 2.0+).

creo que la gestión de transacciones costura suena mejor como transacciones gestionadas por la costura. Significa que Seam se preocupa, detrás de las escenas, de llamar a comenzar y comprometerse. Costura juega el papel de gestor de transacciones mediante el uso de un gestor de costura Transacción

1 ° escenario: POJO + JTA disponible (Apache Tomcat no es compatible con JTA) Gestor

Transacción utilizado por la costura: org.jboss.seam .transaction.UTtransaction

activado por defecto en entorno no EJB (guerra) cuando JTA disponible (JBoss soporte JTA)

Si está utilizando JPA EntityManager o sesión de Hibernate, es necesario registrarse a la costura permite gestionar límites de transacción

Ver 9.3. Seam-managed persistence contexts cómo configurar una costura logró contexto de persistencia (inyectado mediante el uso de @In)

Entonces inyectar un EntityManager (EntityManager) o Sesión (Hibernate) mediante el uso de @In (con ámbito de ScopeType.CONVERSACIÓN)

@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 las escenas, la costura Administrador de transacciones de contar con la EntityManager (APP) o Sesión (Hibernate) en el activo JTA UserTransaction, llamando joinTransaction método

2 ° escenario: POJO + RESOURCE_LOCAL (Cualquiera de Hibernate o JPA) Transacción

administrador de transacciones utilizado por la costura (APP): org.jboss.seam.transaction.EntityTransaction

Transa Gestor cción utilizado por la costura (Hibernate): org.jboss.seam.transaction.HibernateTransaction

Ver 9.3. Seam-managed persistence contexts cómo configurar una costura logró contexto de persistencia (inyectado mediante el uso de @In)

Detrás de las escenas, la costura de transacción gerente se encarga de llamar a comenzar y comprometerse en la tecnología subyacente mediante el uso de proxies

3 ° escenarios: EJB

administrador de transacciones utilizado por la costura: org.jboss.seam.transaction.CMTTransaction

Habilitado de forma predeterminada en el entorno EJB. Tenga cuidado, en ese caso, Seam no controla las transacciones gestionadas por contenedores.

respecto,

5

La forma en que estoy trabajando actualmente es la siguiente:

//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 curso y desea unirse a ella a continuación, se utiliza el userTx.isActive(), etc

+0

hombre excelente !!! Podría usar esto para evitar la excepción "La transacción no está activa". – prageeth

Cuestiones relacionadas