Tipos de transacciones JPA y JTA

por | enero 10, 2014

En el archivo de configuración de JPA persistence.xml se especifica el tipo de transacción(transaction-type) para cada unidad de persistencia.

[xml]
<persistence … >
<persistence-unit name="…" transaction-type="RESOURCE_LOCAL">

</persistence-unit>

</persistence>
[/xml]

Hay dos posibles valores: RESOURCE_LOCAL y JTA.

Resource Local

  • Usado para aplicaciones standalone.
  • Es el responsable de la creación del EntityManager mediante EntityManagerFactory
  • Las transacciones son de tipo EntityTransaction
  • Se debe usar begin() y commit() en cada transacción
  • Si múltiples instancias de EntityManager son creadas para la misma unidad de persistencia, múltiples contextos de persistencia son creados también. Esto quiere decir que las transacciones NO están sincronizadas en toda la aplicación. Una solución a esto es usar UserTransaction. Otra es evitar el uso de múltiples EntityManager para la misma unidad de persistencia.

Uso

[java]
// Creating resources
EntityManagerFactory EMF
= Persistence.createEntityManagerFactory("Standalone");
EntityManager EM = EMF.createEntityManager();

// Transaction
EntityTransaction et = EM.getTransaction();

try {
et.begin();
// Operations…
et.commit();
} catch(Exception ex) {
et.rollback();
}

// Closing resources
EM.close();
EMF.close();
[/java]

JTA

  • JTA  significa Java Transaction API. Es parte de la especificación Java EE.
  • Es el típico valor usado para el contenedor de la aplicación
  • El EntityManager es provisto por el contenedor de la aplicación(una única instancia para toda la aplicación)
  • Las transacciones se pueden declara con @TransactionAttribute y estas serán gestionadas automáticamente.
  • Todas las transacciones están sincronizadas en toda la aplicación con una única transacción JTA.

Uso:

[java]
@PersistenceContext(unitName="Container")
private EntityManager EM;

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void myMethod() throws Exception {

Item i = EM.find(Item.class, 997);

// …

}
[/java]

Mas acerca de transacciones JPA/JTA aquí

Excelente información sobre Transacciones acá

Fuente:  http://www.mytechnotes.biz/2012/08/jpa-transaction-types-and-jta.html