Unité de persistance comme RESOURCE_LOCAL ou JTA?

J’ai des questions comme ci-dessous:

  1. Quelle est la différence de ces deux?
  2. Les deux sont-ils pris en charge par toutes les bases de données?
  3. JPA TransactionManager et JTA TransactionManager sont-ils différents?

Les implémentations JPA permettent de gérer les transactions elles-mêmes ( RESOURCE_LOCAL ) ou de les faire gérer par l’implémentation JTA du serveur d’applications.

Dans la plupart des cas, RESOURCE_LOCAL est correct. 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 s’étend sur plusieurs unités de persistance (ou d’autres bases de données), RESOURCE_LOCAL peut ne pas être suffisant.

JTA est également utilisé pour gérer des transactions sur des systèmes tels que JMS et JCA, mais c’est une utilisation assez exotique pour la plupart d’entre nous.

Pour utiliser JTA, vous avez besoin de la prise en charge sur votre serveur d’application, ainsi que du support JDBC.

En complément d’autres réponses

Voici un extrait de l’article extrêmement utile (publié sur le site Web d’ Apache TomEE ), qui peut également aider à répondre à la première question du PO (le lien vers l’article est ci-dessous).


Comparaison des contextes de persistance RESOURCE_LOCAL et JTA


Avec 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 object 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 à entityManagerFactory.createEntityManager () génère deux instances EntityManager distinctes et, par conséquent, deux PersistanceContexts / Caches distincts.
  • Il n’est presque jamais judicieux d’utiliser plusieurs instances d’EntityManager (n’en créez pas une autre à moins que vous ayez détruit la première)

Avec , le conteneur contiendra EntityManager (PersistenceContext / Cache) pour créer et suivre …

  • 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
  • EntityManager fourni par le conteneur est une référence à 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 vidé et effacé à l’heure de validation JTA

Toute personne intéressée par l’apprentissage de l’API Java Persistence – merci de lire l’article complet ici: JPA Concepts: JPA 101 .

Resource_Local et JTA sont des gestionnaires de transactions (méthodes de transactions). Ce n’est pas la propriété de la firebase database mais le composant responsable de la coordination des 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 effectuez uniquement des transactions JPA. Le gestionnaire de transactions JTA est un gestionnaire de transactions polyvalent et peut inscrire d’autres ressources, telles que des files d’attente JMS, dans une transaction. Les conteneurs Java EE utilisent généralement un gestionnaire de transactions JTA pour les EJB, les entités JPA, etc.