CDI-Transaktions-management
Arbeite ich an einem Projekt migration von JBoss Seam zur CDI.
Folgenden Technologie-stack :
1)WildFly 8.2.0 (CDI 1.2 mit Weld als CDI-Anbieter)
2)JSF 2.2
3)JPA 2
Sind wir mit container verwaltet JTA-Transaktionen :
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="surveillenace" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:/surveillenaceDS</jta-data-source>
<!-- other configurations not shown here -->
</persistence>
und mit @PersistenceContext
annotation inject EntityManager in DAO-Objekt.
Sind wir mit @Transaction
- Anmerkung für die container-verwaltete Transaktionen.
Meine Fragen/Verständnis sind im folgenden beschrieben .
Kann jemand dies bestätigen, da dies ein relativ neues Gebiet für mich.
1)so Wie ich das verstehe , CDI bietet Unterstützung für die CMT durch @Transaktions-interceptor. Das ist die Klasse /Abhängigkeit tatsächlich implementiert diese Abfangjäger ?
Die Artefakte, die wir importieren müssen für diese in pom.xml ?
2)Da die CMT verwendet wird , brauchen wir nicht zur Abgrenzung einer Transaktion und container verwalten. Wir brauchen Sie nur zu verwenden EntityManager API beibehalten von änderungen in der Db.
Ist dieses Verständnis richtig ?
@Transactional
public String finishOperation() {
log.debug("in finishOperation() ") ;
try {
//operations done on managed entities
//no transaction demarcation code is required here
dao.getEntityManager.commit();
}catch(Throwable xx){
}
}
3)Berücksichtigen Sie unten triviale Szenario ausgeführt unter Verwendung der obigen Konfiguration:
Component1.somemethod()
- wird innerhalb der Transaktion und bleibt ein Unternehmen (e.g: User) und verpflichtet die Transaktion.
Nach diesem , Component2 aufgerufen wird, wie folgt :
Component2.somemethod()
- läuft innerhalb der transation aber die Entität User scheint nicht in verwalteter Staat, der em.contains(user)
gibt false zurück.
Ich habe zu verschmelzen, diese Einheit wieder zu machen, verwaltet oder neu laden aus persistenten Speicher wieder
Da Naht verwendet conversation-scoped entity manager
alle entity-Instanzen bleiben im Status " verwaltet (innerhalb persistent-Kontext), selbst wenn jede Komponente commits einer Transaktion und einer anderen Komponente aufgerufen wird, wird dort nach.
Aber in der CDI-Fall , wie ich verstehe, dass dies geschieht aufgrund "transaction scoped entity manager"
. Sobald eine Transaktion ein commit ausgeführt wird , werden alle entity-Instanzen ablösen.
Wie erreichen wir denselben Effekt wie die Naht mit CDI ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage zu beantworten und zu klären vorherigen Antwort, die war nur Ziel-Java EE 6 /CDI 1.0, während Sie arbeiten mit Java-EE-7 /CDI 1.2
@Transactional
und Umsetzung zu übereinstimmenden Abfangjäger. Als Sie unter WildFly, die Antwort auf Ihre Frage ist in der JBoss JTA-Implementierung: Narayana. Finden Sie die@Transactional(Required)
interceptor hier. Andere sind in der gleichen Paket.Unsyncrhonized
Modus, (nicht getestet in CDI).CDI keine Transaktion-management-Umsetzung als Teil seiner specs. Transaction management ist Links umgesetzt werden, indem der Programmierer durch die Abfangjäger, die kümmern sich um all die basics wie starten, Begehen etc.
Normalerweise EntityManager Leben innerhalb der Zeitspanne der Transaktion. In der Naht 2, die Sie hatte, erweiterten Persistenz-Kontext, so ist es gehalten, den Zustand und die Bohnen befestigt, um es über mehrere Anfragen hinweg. CDI nicht vorgesehen, außerdem wird es nicht empfohlen, dass aufgrund der Skalierbarkeit. Wenn man sich anschaut, DeltaSpike, die ich empfehlen stark, dass Sie im Falle von migration-von Seam2 nach CDI-Sie bieten eine option der Verlängerung der Lebensdauer des EntityManager Sie zu fördern, zu Gespräch Bereich, aber Sie wird nicht empfohlen, den Ansatz als gut.
Hier haben Sie docs für DeltaSpike Behandlung von Ihrem problem:
https://deltaspike.apache.org/documentation/jpa.html#ExtendedPersistenceContexts
Deltaspike ist toll verbindliche Lösung und Google docs sind wirklich kurz, also würde ich empfehlen, es in Ihrem Fall, außer es wird durch Menschen mit Naht hintergrund und bietet Transaktions-management, out of the box.
@Transactional
interceptor-binding und die interceptor-Implementierung.