persistence.xml verschiedene Attribute vom Transaktionstyp


70

In der JPA-Konfigurationsdatei persistence.xml können Sie eine Zeile wie die folgende eingeben:

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

oder manchmal:

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

Meine Frage ist:

Was ist der Unterschied zwischen transaction-type="JTA" und transaction-type=”RESOURCE_LOCAL”?

Ich habe auch einige persistence.xml-Dateien mit fehlendem Transaktionstyp bemerkt. Ist es richtig?

Antworten:


117

Standardeinstellungen

Standardmäßig JTA in einer JavaEE-Umgebung und RESOURCE_LOCAL in einer JavaSE-Umgebung.

RESOURCE_LOCAL

Mit sind <persistence-unit transaction-type="RESOURCE_LOCAL">Sie verantwortlich für EntityManager( PersistenceContext/Cache) das Erstellen und Verfolgen

  • Sie müssen das verwenden EntityManagerFactory, um eine zu erhaltenEntityManager
  • Die resultierende EntityManagerInstanz ist ein PersistenceContext/Cache An EntityManagerFactory, das nur über die @PersistenceUnitAnnotation eingefügt werden kann (nicht @PersistenceContext).
  • Sie dürfen sich nicht @PersistenceContextauf eine Typeinheit beziehenRESOURCE_LOCAL
  • Sie müssen die EntityTransactionAPI verwenden, um jeden Aufruf Ihres zu beginnen / festzuschreibenEntityManger
  • Zweimaliges Aufrufen entityManagerFactory.createEntityManager()führt zu zwei getrennten EntityManagerInstanzen und daher zu zwei getrennten PersistenceContexts/Caches.
  • Es ist fast nie eine gute Idee, mehr als eine Instanz einer EntityManagerzu verwenden (erstellen Sie keine zweite, es sei denn, Sie haben die erste zerstört).

JTA

Mit <persistence-unit transaction-type="JTA">dem Container wird EntityManager( PersistenceContext/Cache) erstellt und verfolgt.

  • Sie können das nicht verwenden EntityManagerFactory, um eine zu erhaltenEntityManager
  • Sie können nur eine EntityManagervom Container geliefert bekommen
  • Ein EntityManagerkann nur über die @PersistenceContextAnnotation injiziert werden (nicht @PersistenceUnit)
  • Sie dürfen sich nicht @PersistenceUnitauf eine Einheit vom Typ JTA beziehen
  • Der EntityManagervom Container angegebene PersistenceContext/CacheWert bezieht sich auf die mit einer JTA-Transaktion verknüpfte Transaktion.
  • Wenn keine JTA-Transaktion ausgeführt wird, EntityManagerkann die nicht verwendet werden, da keine vorhanden istPersistenceContext/Cache .
  • Jeder mit einem EntityManagerVerweis auf dieselbe Einheit in derselben Transaktion hat automatisch einen Verweis auf dieselbe EinheitPersistenceContext/Cache
  • Das PersistenceContext/Cachewird zum Zeitpunkt der JTA-Festschreibung geleert und gelöscht

1
Natürlich können Sie JTA auch in einer JavaSE-Umgebung verwenden und die EM selbst von der EMF beziehen ... beispielsweise bei Verwendung eines eigenständigen JTA-Anbieters. Vielleicht beziehen sich Ihre Listen auf JavaSE und JavaEE im Gegensatz zu JTA und RESOURCE_LOCAL
DataNucleus

3
"Es ist fast nie eine gute Idee, mehr als eine Instanz eines EntityManager zu verwenden" - Ist dies Ihre Meinung? Es ist häufig erforderlich, mehrere offene EntityManager in einer gleichzeitigen Anwendung zu öffnen. Im Allgemeinen eine sehr gute Antwort.
Samuel

1
Ich habe RESOURCE_LOCAL verwendet, ohne Transaktionen selbst starten und beenden zu müssen. Ich denke, RESOURCE_LOCAL ist eher wie "Ich möchte diese Datenbank mit lokalem Testspeicher testen", was für JUnit-Tests sehr hilfreich ist.
ha9u63ar

2
Ich stimme der Aussage nicht zu, dass "Sie @PersistenceUnit nicht verwenden dürfen, um auf eine Einheit vom Typ JTA zu verweisen". Ich denke, dass Sie dies einfach tun können und die Methode emf.createEntityManager () verwenden können, um den Entity Manager abzurufen. Und Sie können das Argument vom Typ SynchronizationType verwenden , um festzulegen , ob aktuelle Transaktion sofort verbunden werden soll , oder Sie werden beitreten es sich beim Aufruf von em.joinTransaction () -Methode
chalda

3
Sie können einen Blick auf die Quelle der Antwort mit zusätzlichen Informationen und einem kurzen Beispiel werfen
Radium
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.