Ho domande come di seguito:
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.