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
EntityManagerFactorypara obtener unEntityManager - La instancia de
EntityManagerresultante es unPersistenceContext/CacheUnaEntityManagerFactoryse puede inyectar solo a través de la anotación@PersistenceUnit(no@PersistenceContext). - No
@PersistenceContextusar@PersistenceContextpara referirte a una unidad de tipoRESOURCE_LOCAL - Debe utilizar la API
EntityTransactionpara comenzar / confirmar cada llamada a suEntityManger - Llamar a
entityManagerFactory.createEntityManager()dos veces da como resultado dos instancias separadas deEntityManagery, por lo tanto, dosPersistenceContexts/Cachesseparados. - Casi nunca es una buena idea tener más de una instancia de un
EntityManageren 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
EntityManagerFactorypara obtener unEntityManager - Solo puede obtener un
EntityManagersuministrado por el contenedor - Un
EntityManagerse puede inyectar solo a través de la anotación@PersistenceContext(no@PersistenceUnit) - No
@PersistenceUnitusar@PersistenceUnitpara referirte a una unidad de tipo JTA -
EntityManagerdado por el contenedor es una referencia alPersistenceContext/Cacheasociado con una Transacción JTA. - Si no hay ninguna transacción JTA en progreso, no se puede usar
EntityManagerporque no hayPersistenceContext/Cache. - Todos los que tengan una referencia de
EntityManagera la misma unidad en la misma transacción tendrán automáticamente una referencia al mismoPersistenceContext/Cache -
PersistenceContext/Cachese vacía y se borra en JTA commit time