Ho domande come di seguito:
- Qual è la differenza tra questi due?
- Entrambi sono supportati da tutti i database?
- JPA TransactionManager e JTA TransactionManager sono diversi?
Risposte:
Le implementazioni JPA possono scegliere di gestire le transazioni stesse ( RESOURCE_LOCAL
) o di farle gestire dall'implementazione JTA del server delle applicazioni.
Nella maggior parte dei casi, RESOURCE_LOCAL va bene. Ciò utilizzerebbe transazioni di livello JDBC di base. Lo svantaggio è che la transazione è locale nell'unità di persistenza JPA, quindi se si desidera una transazione che si estende su più unità di persistenza (o altri database), RESOURCE_LOCAL potrebbe non essere sufficiente.
JTA viene utilizzato anche per la gestione delle transazioni su sistemi come JMS e JCA, ma per la maggior parte di noi è un utilizzo abbastanza esotico.
Per utilizzare JTA, è necessario il supporto nel server delle applicazioni e anche il supporto dal 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 dei contesti di persistenza RESOURCE_LOCAL e JTA
Con <persistence-unit transaction-type = "RESOURCE_LOCAL"> TU sei responsabile della creazione e del monitoraggio di EntityManager (PersistenceContext / Cache) ...
- È necessario utilizzare EntityManagerFactory per ottenere un EntityManager
- L' istanza EntityManager risultante è PersistenceContext / Cache
- Un EntityManagerFactory può essere iniettato solo tramite l' annotazione @PersistenceUnit (non @PersistenceContext)
- Siete non autorizzati a utilizzare @PersistenceContext per riferirsi ad un'unità di tipo RESOURCE_LOCAL
- È necessario utilizzare l' API EntityTransaction per iniziare / eseguire il commit su ogni chiamata al proprio EntityManger
- Chiamando entityManagerFactory.createEntityManager () due volte si ottengono due istanze EntityManager separate e quindi due PersistenceContexts / Caches separati.
- Non è quasi mai una buona idea avere più di un'istanza di un EntityManager in uso (non crearne una seconda a meno che tu non abbia distrutto la prima)
Con <persistence-unit transaction-type = "JTA"> il CONTAINER eseguirà la creazione e il monitoraggio di EntityManager (PersistenceContext / Cache) ...
- Non è possibile utilizzare EntityManagerFactory per ottenere un EntityManager
- È possibile ottenere solo un EntityManager fornito dal contenitore
- Un EntityManager può essere iniettato solo tramite l' annotazione @PersistenceContext (non @PersistenceUnit)
- Siete non autorizzati a utilizzare @PersistenceUnit per riferirsi ad un'unità di tipo JTA
- L' 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 è presente PersistenceContext / Cache.
- Chiunque abbia un riferimento EntityManager alla stessa unità nella stessa transazione avrà automaticamente un riferimento alla stessa PersistenceContext / Cache
- PersistenceContext / Cache viene scaricato e cancellato al momento del commit JTA
Chiunque sia interessato ad apprendere l'API Java Persistence, per favore fatevi un favore e leggete l'articolo completo qui: Concetti JPA: JPA 101 .
transaction-type=RESOURCE_LOCAL
e @PersistenceContext
e @Transactional
gestito da primavera
Resource_Local e JTA sono gestori delle transazioni (metodi di esecuzione delle 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 delle transazioni JPA è responsabile delle transazioni JPA e si desidera utilizzarne uno se si esegue solo una transazione JPA. Il gestore delle transazioni JTA è un gestore delle transazioni generico e può inserire altre risorse come le code JMS nella transazione. In genere i contenitori Java EE utilizzano un gestore delle transazioni JTA per EJB, entità JPA, ecc.
resource_local vs JTA si tratta di transazione locale vs transazione globale. Si tratta di poter gestire più risorse in un'unica transazione.
CMT vs BMT riguarda chi sta aprendo e chiudendo la transazione: sviluppatore di applicazioni o server di applicazioni.