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 ?

InformationsquelleAutor Atul | 2015-07-06
Schreibe einen Kommentar