2017-09-23 1 views
0

Je développe une petite application pour mon auto-apprentissage dans struts2, ejb et JPA (Hibernate en tant que fournir) avec le serveur d'application comme Wildfly 10. J'essaie de configurer JTA pour gérer les transactions avec le récipient. Voici mon codeImpossible de faire fonctionner les transactions CMT

Business Service EJB()

@Stateless 
    @TransactionManagement(TransactionManagementType.CONTAINER) 
    public class BusinessService implements BusinessRemote { 

     @EJB 
     Dao bDao; 

     @Override 
     @TransactionAttribute(TransactionAttributeType.REQUIRED) 
     public void updateAll(){ 
      try { 
       dao.saveAll(xyz); 
      } catch (Exception e) { 
       e.printstacktrace(); 
      } 
      try { 
       dao.updateAll(); 
      } catch (Exception e) { 
       e.printstacktrace(); 
      } 
     } 
    } 

DaoImpl (EJB)

@Stateless 
    @TransactionManagement(TransactionManagementType.CONTAINER) 
    public class DaoImpl implements Dao { 

     @PersistenceContext(unitName="db") 
     private EntityManager entityManager; 

     public void saveAll(xyz) { 
       entityManager.persist(xyz); 
      } 

     public void updateAll() { 
       Query query = entityManager.createNamedQuery("getQuery.ById"); 
       query1.executeUpdate(); 

     } 
    } 

persistence.xml

<persistence-unit name="db" transaction-type="JTA"> 
      <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
      <jta-data-source>java:/DB</jta-data-source> 
    <properties> 
       <property name="javax.persistence.jdbc.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
       <property name="hibernate.show_sql" value="true" /> 
       <property name="hibernate.transaction.jta.platform" value="org.hibernate.engine.transaction.jta.platform.internal.JBossStandAloneJtaPlatform" /> 
       <property name="hibernate.current_session_context_class" value="jta"/> 
       <property name="hibernate.transaction.factory_class" value="org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl" /> 
      </properties> 
     </persistence-unit> 

Mais je reçois ci-dessous trace de la pile lorsque updateAll méthode est exécuté.

javax.persistence.TransactionRequiredException: Executing an update/delete query 

Il semble que lorsque la requête de mise à jour est déclenchée, aucune transaction active n'est présente. Lorsque j'essaie d'exécuter la méthode saveAll seulement alors rien n'est enregistré dans la base de données bien que je ne reçoive aucune exception. Si j'essaie de vider les changements, cela donne une exception ci-dessous. Cela signifie que, dans le scénario ci-dessus, le conteneur n'initie aucune transaction. Il semble qu'il manque quelque chose dans mes configurations que je ne trouve pas.

Répondre

0

je manque quelques propriétés dans persistence.xml

correcte est

<property name="javax.persistence.jdbc.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.current_session_context_class" value="jta"/> 
      <property name="hibernate.transaction.factory_class" value="org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl"/> 
     <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />