Wie zu verwenden Container Managed Transaction (CMT) mit JBoss AS 6, Hibernate 3.6, JPA, JTA und EJB3

Ich versuche zum einrichten einer web-app mit CMT. Ich habe es läuft standalone Eclipse ok, und jetzt versuche ich, um es arbeiten innerhalb der Jboss AS 6, unter Verwendung von Struts 1.0. Ich habe mich entschieden CMT weil die doco, die ich gelesen habe Hinweise, dass es die beste und "zuletzt ausführlich zu nutzen". So scheint, wie contempory/good-practice-Nutzung von Hibernate 3.6.

Kann ich Objekte laden aus einer MySQL-Datenbank mit dem folgenden code-Auszüge, aber gespeicherte Objekte werden nicht geleert/synchronisiert/gespeichert in der Datenbank:

Innerhalb von Struts 1.0 Action Klasse:

InitialContext ctx = new InitialContext();   
EntityManagerFactory emf = (EntityManagerFactory)ctx.lookup("java:/MyEntityManagerFactory");

'emf' ist dann an eine Methode übergeben, die mit meiner DAO-Klasse, die nachstehend zusammengefasst ist:

@PersistenceContext(unitName="purejetJPA") EntityManager em;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
exampleMethodInMyCustomDAOClass() {
EntityManager em = emf.createEntityManager();
em.find(MyCustomEntity.class, 542);  //works successfully
em.persist(newInstanceOfMyCustomEntity);          //this executes ok and generates an ID
                                                  //however the entity is not saved to database upon completion 
}

Inhalt persistence.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="myPersistanceUnitName" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/MySqlDS</jta-data-source>
                <class>my.custom.entity.Classes</class>
                <properties>
            <property name="jboss.entity.manager.factory.jndi.name" value="java:/MyEntityManagerFactory"/>
            <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.CMTTransactionFactory"/>
            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
            <property name="hibernate.connection.autocommit" value="false"/>
            <property name="hibernate.current_session_context_class" value="jta"/>
        </properties>   
    </persistence-unit>
</persistence>

Dem Hibernate EntityManager Dokumentation hat eine sehr eingeschränkte Beschreibung, wie die Umsetzung CMT:


Unserer entity-manager/transaction management idiom für CMT und EJB3-container-Nutzung reduziert:
//CMT idiom, durch Injektion
@PersistenceContext(name="Probe") EntityManager em;


Und diese jboss.org Artikel sagt:


Transaktion Abgrenzung mit EJB/CMT

Unser Ziel ist wirklich zu entfernen, transaction demarcation code aus dem data access code:

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void doSomeWork() {

//Do some work
factory.getCurrentSession().load(...);
factory.getCurrentSession().persist(...);
}

Meine Fragen:

  1. In der Zeile "actory.getCurrentSession().load(...);", was für ein Typ ist "factory", und wie erstelle ich es? Ist es Hibernate.SessionFactory? Oder einem Jboss-oder HTTP-Sitzung?

  2. In der Zeile "@PersistenceContext(name="Probe") EntityManager em;" was ist "name" beziehen? Ich fand ein Beispiel in einem forum, etwas mit "unitName" statt "name". Ist diese Linie, wie ich zuerst deklarieren Sie die Objekt EntityManager, dass ich verwenden, um anzurufen .anhalten() .finden (), etc? (und damit mein code, der erstellt eine EntityManagerFactory ist nicht erforderlich)

  3. Sollte ich überlegen, recherchieren und mit "Java Context and Dependency Injection" (CDI)?

Jede Hilfe sehr geschätzt. Bitte lassen Sie mich wissen, was die anderen bits von code oder config-Dateien, die ich liefern sollte,


Update:

Wenn ich nicht verwenden EntityManagerFactory und abrufen eines EntityManager statt mit @PersistenceContext, dann sollte etwas wie in diesem code für mein "session-bean" (die Klasse retriving+speichern von Entitäten, die auf einer pro-Benutzer-Sitzung-basis) werden die Art und Weise, es zu tun?

@Stateful
@TransactionManagement(value=TransactionManagementType.BEAN)
public class X implements IX {

@PersistenceContext(unitName="MySQL", type=PersistenceContextType.EXTENDED)
private EntityManager em;

@Resource
private UserTransaction tx;

public void doStuff() {
   tx.begin();
   em.joinTransaction();
   em.find(myEntity);
   em.perrsist(myEntity);
   tx.commit();
}

Wenn das auf die richtige Spur, was benötigt wird persistence.xml? Von all meinem Lesen von doco und die web-ich bin nicht sicher, wo diese erforderlich sein könnten:

<property name="jboss.entity.manager.factory.jndi.name" value="java:/MyEntityManagerFactory"/>
<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.CMTTransactionFactory"/>
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
<property name="hibernate.connection.autocommit" value="false"/>
<property name="hibernate.current_session_context_class" value="jta"/> 

InformationsquelleAutor willtardy | 2011-03-21

Schreibe einen Kommentar