web-dev-qa-db-fra.com

persistence.xml différents attributs de type de transaction

Dans le fichier de configuration JPA persistence.xml, vous pouvez avoir une ligne comme celle-ci:

<persistence-unit name="com.nz_war_1.0-SNAPSHOTPU" transaction-type="JTA">

ou parfois:

<persistence-unit name="com.nz_war_1.0-SNAPSHOTPU" transaction-type=”RESOURCE_LOCAL”>

Ma question est:

Quelle est la différence entre transaction-type="JTA" et transaction-type=”RESOURCE_LOCAL”?

J'ai aussi remarqué qu'il manquait certains fichiers persistence.xml avec le type de transaction. Est-ce correct?

67
Germano Massullo

Défauts

La valeur par défaut est JTA dans un environnement JavaEE et to RESOURCE_LOCAL dans un environnement JavaSE.

RESOURCE_LOCAL

Avec <persistence-unit transaction-type="RESOURCE_LOCAL"> Vous êtes responsable de la création et du suivi de EntityManager (PersistenceContext/Cache)

  • Vous devez utiliser le EntityManagerFactory pour obtenir un EntityManager
  • L'instance EntityManager résultante est un PersistenceContext/Cache. Un EntityManagerFactory ne peut être injecté que par l'annotation @PersistenceUnit (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/commettre à chaque appel de votre EntityManger
  • Appeler deux fois entityManagerFactory.createEntityManager() donne deux instances EntityManager distinctes et donc deux PersistenceContexts/Caches Distinctes.
  • Ce n'est presque jamais une bonne idée d'avoir plus d'une instance de EntityManager en cours d'utilisation (ne créez pas de seconde instance à moins que vous n'ayez détruit la première)

JTA

Avec <persistence-unit transaction-type="JTA">, Le conteneur créera et effectuera le EntityManager (PersistenceContext/Cache).

  • Vous ne pouvez pas utiliser le EntityManagerFactory pour obtenir un EntityManager
  • Vous ne pouvez obtenir qu'un EntityManager fourni par le conteneur
  • Un EntityManager ne peut être injecté que par l'annotation @PersistenceContext (Pas @PersistenceUnit)
  • Vous n'êtes pas autorisé à utiliser @PersistenceUnit Pour faire référence à une unité de type JTA
  • Le 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, le EntityManager ne peut pas être utilisé car il n'y a pas de PersistenceContext/Cache.
  • Tout le monde avec une référence EntityManager à la même unité dans la même transaction aura automatiquement une référence à la même PersistenceContext/Cache
  • Le PersistenceContext/Cache Est vidé et effacé à l'heure de validation de JTA
110
Jiri Kremser