persistence.xml verschiedene Attribute vom Transaktionstyp

Lesezeit: 3 Minuten

Benutzer-Avatar
Germano Massullo

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

<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 bemerkt, bei denen der Transaktionstyp fehlt. Ist es richtig?

Benutzer-Avatar
Jiri Kremser

Standardwerte

Standard zu JTA in einer JavaEE-Umgebung und zu RESOURCE_LOCAL in einer JavaSE-Umgebung.

RESOURCE_LOCAL

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

  • Sie müssen die verwenden EntityManagerFactory ein zu bekommen EntityManager
  • Das Ergebnis EntityManager Beispiel ist ein PersistenceContext/Cache
    Ein EntityManagerFactory kann über die injiziert werden @PersistenceUnit Nur Anmerkung (nicht @PersistenceContext)
  • Sie dürfen nicht verwenden @PersistenceContext um auf eine Einheit des Typs zu verweisen RESOURCE_LOCAL
  • Sie müssen die verwenden EntityTransaction API, um jeden Aufruf an Ihre zu starten/zu binden EntityManger
  • Berufung entityManagerFactory.createEntityManager() zweimal ergibt zwei getrennte EntityManager Instanzen und damit zwei separate PersistenceContexts/Caches.
  • Es ist fast nie eine gute Idee, mehr als eine Instanz von an zu haben EntityManager in Gebrauch (erstelle kein zweites, es sei denn, du hast das erste zerstört)

JTA

Mit <persistence-unit transaction-type="JTA"> der Behälter wird es tun EntityManager (PersistenceContext/Cache) Erstellen und Verfolgen.

  • Sie können die nicht verwenden EntityManagerFactory ein zu bekommen EntityManager
  • Sie können nur eine bekommen EntityManager vom Container geliefert
  • Ein EntityManager kann über die injiziert werden @PersistenceContext Nur Anmerkung (nicht @PersistenceUnit)
  • Sie dürfen nicht verwenden @PersistenceUnit um auf eine Einheit vom Typ JTA zu verweisen
  • Das EntityManager durch den Container gegeben ist ein Verweis auf die PersistenceContext/Cache einer JTA-Transaktion zugeordnet.
  • Wenn keine JTA-Transaktion im Gange ist, wird die EntityManager kann nicht verwendet werden, da es keine gibt PersistenceContext/Cache.
  • Jeder mit einem EntityManager Verweis auf dieselbe Einheit in derselben Transaktion hat automatisch einen Verweis auf dieselbe PersistenceContext/Cache
  • Das PersistenceContext/Cache wird zur JTA-Commit-Zeit geleert und gelöscht

  • und natürlich können Sie JTA auch in einer JavaSE-Umgebung verwenden und das EM selbst von der EMF abrufen … z. B. wenn Sie einen eigenständigen JTA-Anbieter verwenden. Vielleicht beziehen sich Ihre Listen auf JavaSE und JavaEE im Gegensatz zu JTA und RESOURCE_LOCAL

    – DataNucleus

    27. Juni 2013 um 8:17 Uhr

  • “Es ist fast nie eine gute Idee, mehr als eine Instanz eines EntityManagers zu verwenden” — Ist das Ihre Meinung? Es ist oft erforderlich, dass mehrere geöffnete EntityManager in einer Anwendung gleichzeitig geöffnet sind. Im Allgemeinen eine sehr gute Antwort.

    – Samuel

    1. August 2014 um 15:29 Uhr


  • 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

    22. Januar 2015 um 1:16 Uhr

  • Ich stimme der Aussage “Sie dürfen @PersistenceUnit nicht verwenden, um auf eine Einheit vom Typ JTA zu verweisen” nicht zu. Ich denke, dass Sie dies leicht tun können, und Sie können die Methode emf.createEntityManager() verwenden, um den Entitätsmanager zu erhalten. Und Sie können das Argument vom Typ SynchronizationType verwenden, um zu definieren, ob der aktuellen Transaktion sofort beigetreten werden soll, oder Sie selbst beitreten, wenn Sie die Methode em.joinTransaction() aufrufen

    – Chald

    5. März 2015 um 16:24 Uhr

  • Sie können sich die Quelle der Antwort mit zusätzlichen Informationen und einem kurzen Beispiel ansehen: tomee.apache.org/jpa-concepts.html

    – Radium

    27. April 2016 um 13:26 Uhr


1206390cookie-checkpersistence.xml verschiedene Attribute vom Transaktionstyp

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy