J'ai des questions comme ci-dessous:
- Quelle est la différence entre ces deux?
- Ces deux éléments sont-ils pris en charge par toutes les bases de données?
- JPA TransactionManager et JTA TransactionManager sont-ils différents?
Réponses:
Les implémentations JPA ont le choix de gérer elles-mêmes les transactions ( RESOURCE_LOCAL
) ou de les faire gérer par l'implémentation JTA du serveur d'applications.
Dans la plupart des cas, RESOURCE_LOCAL convient. Cela utiliserait des transactions de base au niveau JDBC. L'inconvénient est que la transaction est locale à l'unité de persistance JPA, donc si vous voulez une transaction qui couvre plusieurs unités de persistance (ou d'autres bases de données), alors RESOURCE_LOCAL peut ne pas être assez bon.
JTA est également utilisé pour gérer les transactions sur des systèmes tels que JMS et JCA, mais c'est un usage assez exotique pour la plupart d'entre nous.
Pour utiliser JTA, vous devez le prendre en charge dans votre serveur d'applications, ainsi que le support du pilote JDBC.
En complément d'autres réponses
Voici un extrait de l'article extrêmement utile (publié sur le site Apache TomEE ), qui peut également aider à répondre à la première question de l'OP (le lien vers l'article est ci-dessous).
Comparaison des contextes de persistance RESOURCE_LOCAL et JTA
Avec <persistence-unit transaction-type = "RESOURCE_LOCAL"> VOUS êtes responsable de la création et du suivi d'EntityManager (PersistenceContext / Cache) ...
- Vous devez utiliser EntityManagerFactory pour obtenir un EntityManager
- L' instance EntityManager résultante est un PersistenceContext / Cache
- Un EntityManagerFactory peut être injecté via l' annotation @PersistenceUnit uniquement (pas @PersistenceContext)
- Vous n'êtes pas autorisé à utiliser @PersistenceContext pour faire référence à une unité de type RESOURCE_LOCAL
- Vous devez utiliser l' API EntityTransaction pour commencer / valider chaque appel à votre EntityManger
- L'appel double de entityManagerFactory.createEntityManager () donne deux instances EntityManager distinctes et donc deux PersistenceContexts / Caches séparés.
- Ce n'est presque jamais une bonne idée d'avoir plus d'une instance d'un EntityManager en cours d'utilisation (ne créez pas une seconde à moins d'avoir détruit la première)
Avec <persistence-unit transaction-type = "JTA"> le CONTAINER effectuera la création et le suivi d'EntityManager (PersistenceContext / Cache) ...
- Vous ne pouvez pas utiliser EntityManagerFactory pour obtenir un EntityManager
- Vous ne pouvez obtenir qu'un EntityManager fourni par le conteneur
- Un EntityManager peut être injecté via l' annotation @PersistenceContext uniquement (pas @PersistenceUnit)
- Vous n'êtes pas autorisé à utiliser @PersistenceUnit pour faire référence à une unité de type JTA
- L' EntityManager donné par le conteneur est une référence au PersistenceContext / Cache associé à une transaction JTA.
- Si aucune transaction JTA n'est en cours, EntityManager ne peut pas être utilisé car il n'y a pas de PersistenceContext / Cache.
- Toute personne ayant une référence EntityManager à la même unité dans la même transaction aura automatiquement une référence au même PersistenceContext / Cache
- Le PersistenceContext / Cache est rincé et effacé à JTA engager le temps
Toute personne intéressée par l'API Java Persistence - rendez-vous service et lisez l'article complet ici: Concepts JPA: JPA 101 .
transaction-type=RESOURCE_LOCAL
et @PersistenceContext
et @Transactional
géré par Spring
Resource_Local et JTA sont des gestionnaires de transactions (méthodes de transactions). Ce n'est pas la propriété de la base de données mais le composant chargé de coordonner les transactions. Les gestionnaires de transactions JPA et JTA sont différents. Le gestionnaire de transactions JPA est responsable des transactions JPA et vous souhaitez en utiliser une si vous ne faites que des transactions JPA. Le gestionnaire de transactions JTA est un gestionnaire de transactions à usage général et peut enrôler d'autres ressources telles que les files d'attente JMS dans la transaction. Généralement, les conteneurs Java EE utilisent un gestionnaire de transactions JTA pour les EJB, les entités JPA, etc.
resource_local vs JTA il s'agit de transaction locale vs transaction globale. Il s'agit de gérer plusieurs ressources en une seule transaction.
CMT vs BMT, il s'agit de savoir qui ouvre et clôture la transaction - développeur d'applications ou serveur d'applications.