java - transaction - Unidad de persistencia como RESOURCE_LOCAL o JTA?
unidad de persistencia en java (3)
Tengo consultas de la siguiente manera:
- ¿Cuál es la diferencia de estos dos?
- ¿Ambos son compatibles con todas las bases de datos?
- ¿Son JPA TransactionManager y JTA TransactionManager diferentes?
Resource_Local y JTA son gestores de transacciones (métodos de hacer transacciones). Esta no es propiedad de la base de datos, sino el componente responsable de coordinar las transacciones. Los gerentes de transacción de JPA y JTA son diferentes. El administrador de transacciones JPA es responsable de las transacciones JPA y desea usar uno si solo está haciendo una transacción JPA. El administrador de transacciones JTA es un administrador de transacciones de propósito general y puede solicitar otros recursos, como colas JMS en la transacción. Normalmente, los contenedores Java EE emplean un administrador de transacciones JTA para EJB, entidades JPA, etc.
Como una adición a otras respuestas
Aquí hay un extracto del artículo extremadamente útil (publicado en el sitio web de Apache TomEE ), que también puede ayudar a responder la primera pregunta del OP (el enlace al artículo está más abajo).
Comparación de contextos de persistencia RESOURCE_LOCAL y JTA
Con <persistence-unit transaction-type = "RESOURCE_LOCAL"> USTED es responsable de la creación y 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 puedes 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)
Con <persistence-unit transaction-type = "JTA"> el CONTAINER 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 puedes 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
Cualquier persona interesada en aprender la API Java Persistence, hágase un favor y lea el artículo completo aquí: Conceptos JPA: JPA 101 .
Las implementaciones de JPA tienen la opción de administrar las transacciones por sí mismas ( RESOURCE_LOCAL
), o de que sean administradas por la implementación de JTA del servidor de aplicaciones.
En la mayoría de los casos, RESOURCE_LOCAL está bien. Esto usaría transacciones básicas a nivel de JDBC. La desventaja es que la transacción es local para la unidad de persistencia de JPA, por lo que si desea una transacción que abarque varias unidades de persistencia (u otras bases de datos), entonces RESOURCE_LOCAL puede no ser lo suficientemente bueno.
JTA también se usa para administrar transacciones en sistemas como JMS y JCA, pero ese es un uso bastante exótico para la mayoría de nosotros.
Para usar JTA, necesita soporte en su servidor de aplicaciones, y también soporte del controlador JDBC.