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?
Respuestas:
Las implementaciones de JPA tienen la opción de administrar las transacciones por sí mismas ( RESOURCE_LOCAL
) o hacer que las administre 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 de nivel JDBC. La desventaja es que la transacción es local para la unidad de persistencia JPA, por lo que si desea una transacción que abarque varias unidades de persistencia (u otras bases de datos), es posible que RESOURCE_LOCAL no sea 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.
Como complemento 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 se encuentra a continuación).
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) ...
- Usted debe utilizar el EntityManagerFactory para obtener un EntityManager
- La instancia de EntityManager resultante es PersistenceContext / Cache
- Una EntityManagerFactory se puede inyectar a través de la anotación @PersistenceUnit solo (no @PersistenceContext)
- No se le permite usar @PersistenceContext para referirse a una unidad de tipo RESOURCE_LOCAL
- Usted debe utilizar el EntityTransaction API para comenzar / commit alrededor de cada llamada a su EntityManger
- Llamar a entityManagerFactory.createEntityManager () dos veces da como resultado dos instancias de EntityManager separadas y, por lo tanto, dos PersistenceContexts / Caches separados.
- Es casi nunca es una buena idea tener más de una instancia de un EntityManager en uso (no crear un segundo menos que haya destruido la primera)
Con <persistence-unit transaction-type = "JTA"> el CONTENEDOR hará el EntityManager (PersistenceContext / Cache) creando y rastreando ...
- No puede usar EntityManagerFactory para obtener un EntityManager
- Solo puede obtener un EntityManager proporcionado por el contenedor
- Un EntityManager se puede inyectar a través de la anotación @PersistenceContext solo (no @PersistenceUnit)
- No se le permite usar @PersistenceUnit para referirse a una unidad de tipo JTA
- El EntityManager proporcionado por el contenedor es una referencia al PersistenceContext / Cache asociado con una transacción JTA.
- Si no hay ninguna transacción JTA en curso, EntityManager no se puede utilizar 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 borra en el momento de la confirmación de JTA
Cualquiera que esté interesado en aprender la API de persistencia de Java, hágase un favor y lea el artículo completo aquí: Conceptos de JPA: JPA 101 .
transaction-type=RESOURCE_LOCAL
y @PersistenceContext
y @Transactional
gestionado por la primavera
Resource_Local y JTA son administradores de transacciones (métodos para realizar transacciones). Esta no es propiedad de la base de datos, sino el componente responsable de coordinar las transacciones. Los administradores de transacciones JPA y JTA son diferentes. El administrador de transacciones de JPA es responsable de las transacciones de JPA y desea utilizar uno si solo está realizando una transacción de JPA. El administrador de transacciones de JTA es un administrador de transacciones de propósito general y puede incorporar otros recursos como las colas JMS en la transacción. Normalmente, los contenedores Java EE emplean un administrador de transacciones JTA para EJB, entidades JPA, etc.
resource_local vs JTA se trata de transacciones locales vs transacciones globales. Se trata de si podemos gestionar varios recursos en una sola transacción.
CMT vs BMT se trata de quién abre y cierra la transacción: desarrollador de aplicaciones o servidor de aplicaciones.