簡體   English   中英

EntityManager.merge()未提交(Wildfly,JPA,JTA)

[英]EntityManager.merge() is not being committed (Wildfly, JPA, JTA)

我可以保留新數據,但我不能做更新。 沒有錯誤,只有沒有事務提交更改。 我假設這與我設置交易的方式有關。 我正在嘗試一系列相對較新的(對我來說)技術。 以下是詳細信息。

我正在使用以下工具/技術:

  • Wildfly 8和Java 7(這是我的托管服務使用的)
  • 注釋,以最小的XML為目標
  • Struts 2.3(使用常規插件)
  • 春天3.2
  • Hibernate 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數據源,因為一些網站聲稱這是必要的,但這不起作用(不這么認為,但不得不嘗試)。 還嘗試使用dataSource配置emf,而不是像其他一些站點那樣配置persistenceUnitName。 沒有快樂。
  • 我嘗試用JpaTransactionManager替換transactionManager,但這只是導致了這個異常:JTA EntityManager無法使用getTransaction()

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM