Unità di persistenza come RESOURCE_LOCAL o JTA?

Ho domande come di seguito:

  1. Qual è la differenza di questi due?
  2. Entrambi sono supportati da tutti i database?
  3. JPA TransactionManager e JTA TransactionManager sono diversi?

Le implementazioni JPA hanno la possibilità di gestire le transazioni stesse ( RESOURCE_LOCAL ) o di gestirle tramite l’implementazione JTA del server delle applicazioni.

Nella maggior parte dei casi, RESOURCE_LOCAL va bene. Questo userebbe transazioni di livello JDBC di base. Lo svantaggio è che la transazione è locale all’unità di persistenza JPA, quindi se si desidera una transazione che si estende su più unità di persistenza (o altri database), allora RESOURCE_LOCAL potrebbe non essere abbastanza buono.

JTA viene anche utilizzato per la gestione delle transazioni tra sistemi come JMS e JCA, ma questo è un uso abbastanza esotico per la maggior parte di noi.

Per utilizzare JTA, è necessario il supporto per esso nel server delle applicazioni e anche il supporto del driver JDBC.

In aggiunta ad altre risposte

Ecco un estratto dall’articolo estremamente utile (pubblicato sul sito Web di Apache TomEE ), che può anche aiutare a rispondere alla prima domanda dell’OP (il link all’articolo è sotto).


Confronto tra i contesti di persistenza RESOURCE_LOCAL e JTA


Con TU sei responsabile di EntityManager (PersistenceContext / Cache) per la creazione e il tracciamento …

  • È necessario utilizzare EntityManagerFactory per ottenere un EntityManager
  • L’istanza di EntityManager risultante è PersistenceContext / Cache
  • Un EntityManagerFactory può essere iniettato solo tramite l’annotazione @PersistenceUnit (non @PersistenceContext)
  • Non sei autorizzato a utilizzare @PersistenceContext per fare riferimento a un’unità di tipo RESOURCE_LOCAL
  • È necessario utilizzare l’API EntityTransaction per iniziare / eseguire il commit di ogni chiamata a EntityManger
  • Chiamando entityManagerFactory.createEntityManager () due volte risultano due istanze EntityManager separate e quindi due PersistenceContexts / Caches separate.
  • Non è quasi mai una buona idea avere più di un’istanza di un EntityManager in uso (non crearne un altro a meno che tu non abbia distrutto il primo)

Con il CONTAINER eseguirà EntityManager (PersistenceContext / Cache) per creare e tracciare …

  • Non è ansible utilizzare EntityManagerFactory per ottenere un EntityManager
  • È ansible ottenere solo un EntityManager fornito dal contenitore
  • Un EntityManager può essere iniettato solo tramite l’annotazione @PersistenceContext (non @PersistenceUnit)
  • Non sei autorizzato a utilizzare @PersistenceUnit per fare riferimento a un’unità di tipo JTA
  • EntityManager fornito dal contenitore è un riferimento a PersistenceContext / Cache associato a una transazione JTA.
  • Se non è in corso alcuna transazione JTA, EntityManager non può essere utilizzato perché non esiste PersistenceContext / Cache.
  • Chiunque abbia un riferimento EntityManager alla stessa unità nella stessa transazione avrà automaticamente un riferimento allo stesso PersistenceContext / Cache
  • PersistenceContext / Cache viene svuotato e cancellato al momento del commit JTA

Chiunque sia interessato ad apprendere l’API di Java Persistence, si prega di farsi un favore e leggere l’intero articolo qui: JPA Concepts: JPA 101 .

Resource_Local e JTA sono gestori delle transazioni (metodi per effettuare transazioni). Questa non è la proprietà del database ma il componente responsabile del coordinamento delle transazioni. I gestori delle transazioni JPA e JTA sono diversi. Il gestore transazioni JPA è responsabile delle transazioni JPA e si desidera utilizzarne uno se si esegue solo la transazione JPA. Il gestore transazioni JTA è un gestore transazioni generico e può includere altre risorse come le code JMS nella transazione. In genere i contenitori EE Java utilizzano un gestore transazioni JTA per EJB, quadro JPA, ecc.