我可以坚持新的数据,但我不能做更新。没有错误,只是没有事务提交更改。我认为这与我设置交易的方式有关。我正在尝试一堆相对较新的(对我来说)一套技术。以下是详细信息。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()
“@TransactionTransactionManagement”在这里几乎没用,它只能在'@Configuration '注释类(你已经有了' '。因为你使用的是EJB,所以你应该注意你使用了正确的'@Transactional'注释,否则容器不会启动事务,将会弹出,因为EJB不是弹簧管理的 –
感谢您的信息当您说“正确的@Transactional注释”时,您的意思是什么?您是否在谈论传播属性? –
不是您使用的是正确的,你不应该使用Spring版本,而是EJB版本。 –