gpt4 book ai didi

java - EntityManager.merge() 未提交(Wildfly、JPA、JTA)

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:58 25 4
gpt4 key购买 nike

我可以保留新数据,但无法进行更新。没有错误,只是没有事务提交更改。我假设这与我设置交易的方式有关。我正在尝试一系列(对我来说)相对较新的技术。以下是详细信息。

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

  • Wildfly 8 和 Java 7(这是我的托管服务使用的)
  • 注释,以最少的 XML 为目标
  • Struts 2.3(使用约定插件)
  • Spring 3.2
  • hibernate 4.3
  • JTA(使用容器管理事务 (CMT))
  • JPA 2(具有容器管理的持久性上下文)
  • EJB(我有一个运行 htmlunit 测试的远程客户端应用程序)
  • 部署了三个 WAR 文件和一个 EJB JAR 文件
  • SpringBeanAutowiringInterceptor Autowiring 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>

持久性.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)”

关于java - EntityManager.merge() 未提交(Wildfly、JPA、JTA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42258019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com