2017-09-23 49 views
0

我正在開發一個小型應用程序,用於在struts2,ejb和JPA(Hibernate作爲提供)中將自學習作爲Wildfly 10與應用程序服務器進行自我學習。我試圖配置JTA以管理與容器。下面是我的代碼無法使CMT事務工作

業務服務(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> 

,但我得到以下堆棧跟蹤時updateAll方法被執行。

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

看來,當更新查詢被觸發時,沒有活動事務存在。當我嘗試執行saveAll方法時,雖然我沒有收到任何異常,但沒有任何內容保存在數據庫中。如果我嘗試刷新更改,則會給出以下例外。

javax.persistence.TransactionRequiredException: no transaction is in progress 

所以這意味着在上述情況下容器根本不會啓動任何事務。似乎我的配置中缺少一些我無法找到的東西。

回答

0

我在persistence.xml

正確缺少某些屬性是

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