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?
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