Comment utiliser Gérée par le Conteneur de Transaction (CMT) avec JBoss as, 6, Hibernate 3.6, JPA, JTA et EJB3

Je suis d'essayer de configuration d'une application web à l'aide de la CMT. Je l'ai exécution autonome au sein d'Eclipse ok, et maintenant, je vais essayer de le faire fonctionner à l'intérieur de Jboss as 6, en utilisant Struts 1.0. J'ai choisi CMT parce que le doco j'ai lu des conseils qu'il est le meilleur et le moins verbeux". Semble comme contemporain/bonnes-pratiques dans l'utilisation de Hibernate 3.6.

Je peux charger des objets à partir d'une base de données MySQL avec le code suivant des extraits, mais des objets persistants ne sont pas vidées/synchronisé/enregistré à la base de données:

De l'intérieur Struts 1.0 classe d'Action:

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

'fem' est ensuite passé à une méthode de ma classe DAO qui est résumée ci-dessous:

@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 
}

Contenu de 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>

Hibernate EntityManager la documentation est très limité description de la façon de réaliser CMT:


Notre entité gestionnaire de transaction/gestion de l'idiome pour la CMT et EJB3 container-usage est réduit à ceci:
//CMT idiome par injection
@PersistenceContext(name="exemple") EntityManager em;


Et ce jboss.org l'article dit:


La démarcation des transactions avec les EJB/CMT

Notre objectif est vraiment de supprimer toute opération de démarcation du code à partir du code d'accès aux données:

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

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

Mes questions:

  1. Dans la ligne "actory.getCurrentSession().charge(...);", de quel type "d'usine", et comment dois-je le créer? Est-elle mise en veille prolongée.SessionFactory? Ou Jboss ou de la session HTTP?

  2. Dans la ligne "@PersistenceContext(name="exemple") EntityManager em;" qu'est-ce que le "nom" de référence? J'ai trouvé un exemple sur un forum de quelque chose en utilisant "nombloc" au lieu de "nom". Est-ce ligne comment j'ai d'abord déclarer l'objet EntityManager que j'utilise pour appeler .persist() .find (), etc? (et donc mon code qui crée un EntityManagerFactory n'est pas nécessaire)

  3. Devrais-je envisager de recherches et l'utilisation de "Java Contexte et l'Injection de Dépendance" (CDI)?

Toute aide appréciée. S'il vous plaît laissez-moi savoir ce que d'autres morceaux de code ou les fichiers de config je devrais approvisionnement


Mise à jour:

Si je n'utilise pas EntityManagerFactory, et de récupérer un EntityManager au lieu de l'utilisation de @PersistenceContext, alors, si quelque chose comme ce code pour mon "session bean" (la classe retriving+sauvegarde des entités par l'utilisateur de la session de base) être le moyen de le faire?

@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();
}

Si ce n'est sur la bonne voie, ce qui est nécessaire dans persistence.xml? De toutes mes lectures de doco et le web, je ne suis pas sûr de ces pourrait être requis:

<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"/> 

OriginalL'auteur willtardy | 2011-03-21