2017-02-15 76 views
1

我可以堅持新的數據,但我不能做更新。沒有錯誤,只是沒有事務提交更改。我認爲這與我設置交易的方式有關。我正在嘗試一堆相對較新的(對我來說)一套技術。以下是詳細信息。EntityManager.merge()沒有被提交(Wildfly,JPA,JTA)

我使用以下工具/技術:

  • Wildfly 8和Java 7(這是我的託管服務使用)
  • 批註,以最小的XML作爲目標
  • 的Struts 2.3 (使用常規插件)
  • 春季3.2
  • 休眠4.3
  • JTA(與容器管理的事務(CMT))
  • JPA 2(有一個容器管理的持久化上下文)
  • 的EJB(我有一個運行的HtmlUnit測試遠程客戶端應用程序)
  • 三WAR文件和一個EJB JAR文件部署
  • 的SpringBeanAutowiringInterceptor自動裝配EJB組件(莫不是在這裏一個錯誤的交易不會犯?)

beanRefContext.xml(通過的SpringBeanAutowiringInterceptor要求)

<beans> 
    <bean 
    class="org.springframework.context.support.ClassPathXmlApplicationContext"> 
    <constructor-arg value="classpath:campaignerContext.xml" /> 
    </bean> 
</beans> 

campaignerContext.xml

<beans> 
    <context:component-scan base-package="..." /> 
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/CampaignerDS"/> 
    <tx:annotation-driven/> 
    <tx:jta-transaction-manager/> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="campaigner" /> 
    </bean> 
    <bean id="ehCacheManager" class="net.sf.ehcache.CacheManager" factory-method="create"> 
    <constructor-arg type="java.net.URL" value="classpath:/campaigner_ehcache.xml"/> 
    </bean> 
</beans> 

的persistence.xml

<persistence> 
    <persistence-unit name="campaigner" transaction-type="JTA"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <jta-data-source>java:/jdbc/CampaignerDS</jta-data-source> 

    <class>....UserRegistration</class> 
    ... 

    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> 

    <properties> 
     <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

SecurityServiceBean.java

@EnableTransactionManagement 
@TransactionManagement(value = TransactionManagementType.CONTAINER) 
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) 
@Stateless 
@Interceptors(SpringBeanAutowiringInterceptor.class) 
@DeclareRoles("Security Admin") 
public class SecurityServiceBean extends AbstractCampaignerServiceImpl implements 
    SecurityServiceLocal, SecurityServiceRemote 
{ 
    @Override 
    @PermitAll 
    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    public UserRegistration confirmRegistration(
    String confirmationCode) throws ApplicationException 
    { 
     UserRegistration userRegistration = this.userRegistrationDAO 
     .find(new UserRegistrationQuery(null, confirmationCode)).uniqueResult(); // Should be attached now 

    ... 
      userRegistration.setConfirmationDate(new Date()); 
      userRegistration.setState(State.CONFIRMED); 
      userRegistration = this.userRegistrationDAO.saveOrUpdate(userRegistration); 
    ... 
    } 
} 

UserRegistrationDAO.java

@Override 
public UserRegistration saveOrUpdate(
    UserRegistration obj) throws DAOException 
{ 
    log.debug("[saveOrUpdate] isJoinedToTransaction? " 
      + (this.em.isJoinedToTransaction() ? "Y " : "N")); 

    try 
    { 
    if (obj.getId() == null) 
    { 
     this.em.persist(obj); 

     log.debug("[saveOrUpdate] called persist()"); 

     return obj; 
    } 
    else 
    { 
     UserRegistration attached = this.em.merge(obj); 

     log.debug("[saveOrUpdate] called merge()"); 

     return attached; 
    } 
    } 
    catch (PersistenceException e) 
    { 
    throw new DAOException("[saveOrUpdate] obj=" + obj.toString() + ",msg=" + e.getMessage(), e); 
    } 
} 

Wildfly的standalone.xml中是否存在需要查看或應該設置的設置?

順便說一句,這是令人難以置信的煩人和令人沮喪。這應該是一個簡單的一次性設置,我可以做,然後忘記,因爲我繼續創建我的網站,這應該是我大部分時間花在哪裏。缺乏全面的文檔是令人驚歎的。現在,發展已經停止,直到這個解決 /咆哮

最新通報

  • 我試圖切換到XA數據源,因爲一些網站宣稱,這是必要的,但沒有工作(沒不這麼認爲,但必須嘗試)。還嘗試配置emf與dataSource而不是persistenceUnitName像其他網站一樣。沒有快樂。
  • 我試着用JpaTransactionManager接口更換transactionManager的,但只是導致這一例外:JTA EntityManager的不能使用getTransaction()
+0

「@TransactionTransactionManagement」在這裏幾乎沒用,它只能在'@Configuration '註釋類(你已經有了''。因爲你使用的是EJB,所以你應該注意你使用了正確的'@Transactional'註釋,否則容器不會啓動事務,將會彈出,因爲EJB不是彈簧管理的 –

+0

感謝您的信息當您說「正確的@Transactional註釋」時,您的意思是什麼?您是否在談論傳播屬性? –

+1

不是您使用的是正確的,你不應該使用Spring版本,而是EJB版本。 –

回答

0

答案,感謝M. Deinum,是我用錯了@事務。我應該一直使用javax.transaction.Transactional,但是使用了Spring的。請注意,正確的看起來像「@Transactional(TxType.REQUIRES_NEW)」,而不是「@Transactional(propagation = Propagation.REQUIRES_NEW)」