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 unEntityManager
- La instancia de
EntityManager
resultante es unPersistenceContext/Cache
UnaEntityManagerFactory
se puede inyectar solo a través de la anotación@PersistenceUnit
(no@PersistenceContext
). - No
@PersistenceContext
usar@PersistenceContext
para referirte a una unidad de tipoRESOURCE_LOCAL
- Debe utilizar la API
EntityTransaction
para comenzar / confirmar cada llamada a suEntityManger
- Llamar a
entityManagerFactory.createEntityManager()
dos veces da como resultado dos instancias separadas deEntityManager
y, por lo tanto, dosPersistenceContexts/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 unEntityManager
- 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 alPersistenceContext/Cache
asociado con una Transacción JTA. - Si no hay ninguna transacción JTA en progreso, no se puede usar
EntityManager
porque no hayPersistenceContext/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 mismoPersistenceContext/Cache
-
PersistenceContext/Cache
se vacía y se borra en JTA commit time