usertransaction transaction resource_local persistencecontext example entitymanagers container cannot java jpa java-ee jta persistence.xml

java - transaction - persistence xml resource_local example



persistence.xml atributos diferentes de tipo de transacción (1)

En el archivo de configuración de persistencia.xml JPA, puede tener una línea como:

<persistence-unit name="com.nz_war_1.0-SNAPSHOTPU" transaction-type="JTA">

o algunas veces:

<persistence-unit name="com.nz_war_1.0-SNAPSHOTPU" transaction-type=”RESOURCE_LOCAL”>

Mi pregunta es:

¿Cuál es la diferencia entre transaction-type="JTA" y transaction-type=”RESOURCE_LOCAL” ?

También noté algunos archivos persistence.xml con el tipo de transacción faltante. ¿Es correcto?


Valores predeterminados

Valor predeterminado en JTA en un entorno JavaEE y en RESOURCE_LOCAL en un entorno JavaSE.

RESOURCE_LOCAL

Con <persistence-unit transaction-type="RESOURCE_LOCAL"> usted es responsable de la creación y el seguimiento de EntityManager ( PersistenceContext/Cache )

  • Debe usar EntityManagerFactory para obtener un EntityManager
  • La instancia de EntityManager resultante es un PersistenceContext/Cache Una EntityManagerFactory se puede inyectar solo a través de la anotación @PersistenceUnit (no @PersistenceContext ).
  • No @PersistenceContext usar @PersistenceContext para referirte a una unidad de tipo RESOURCE_LOCAL
  • Debe utilizar la API EntityTransaction para comenzar / confirmar cada llamada a su EntityManger
  • Llamar a entityManagerFactory.createEntityManager() dos veces da como resultado dos instancias separadas de EntityManager y, por lo tanto, dos PersistenceContexts/Caches separados.
  • Casi nunca es una buena idea tener más de una instancia de un EntityManager en uso (no cree una segunda a menos que haya destruido la primera)

JTA

Con <persistence-unit transaction-type="JTA"> el contenedor hará que EntityManager ( PersistenceContext/Cache ) cree y rastree.

  • No puede usar EntityManagerFactory para obtener un EntityManager
  • Solo puede obtener un EntityManager suministrado por el contenedor
  • Un EntityManager se puede inyectar solo a través de la anotación @PersistenceContext (no @PersistenceUnit )
  • No @PersistenceUnit usar @PersistenceUnit para referirte a una unidad de tipo JTA
  • EntityManager dado por el contenedor es una referencia al PersistenceContext/Cache asociado con una Transacción JTA.
  • Si no hay ninguna transacción JTA en progreso, no se puede usar EntityManager porque no hay PersistenceContext/Cache .
  • Todos los que tengan una referencia de EntityManager a la misma unidad en la misma transacción tendrán automáticamente una referencia al mismo PersistenceContext/Cache
  • PersistenceContext/Cache se vacía y se borra en JTA commit time