Java CMT JTA,但是;“没有正在进行的交易”;
我可以调用Java CMT JTA,但是;“没有正在进行的交易”;,java,spring,jpa,transactions,jta,Java,Spring,Jpa,Transactions,Jta,我可以调用entityManager.merge(obj),但不能调用entityManager.flush() 我得到“没有正在进行的交易” 我的应用程序上下文有: <jee:jndi-lookup jndi-name="${persistenceEMFJndiServerName}" id="entityManagerFactory" expected-type="javax.persistence.EntityManagerFactory" /> <bean
entityManager.merge(obj)
,但不能调用entityManager.flush()
我得到“没有正在进行的交易”
我的应用程序上下文有:
<jee:jndi-lookup jndi-name="${persistenceEMFJndiServerName}"
id="entityManagerFactory" expected-type="javax.persistence.EntityManagerFactory" />
<bean id="entityManager"
class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" >
</bean>
我试过一些方法,比如:entityManager.joinTransaction()
,entityManager.getTransaction().begin()/.end()
,@Resource UserTransaction
使用BEAN
事务管理,但它说我不能使用JTA。只是没有交易在进行
我的方法是
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
这是一个EJB,所以我很恼火。CMT JTA应该独自完成事务 原来这不是JPA/JBoss/etc.问题。这是因为我的线程在骆驼上下文中运行 我花了一天的时间搜索: 重要的 :一个事务与单个执行线程关联! –如果您在子路由中使用“seda”、“vm”、“jms”或任何其他协议,这些协议将在不同的线程中处理交换,则此执行将不属于此事务上下文的一部分 供参考: “骆驼3.0.0中的异步事务”
我将entityManager.merge/flush代码放在一个线程中。因此,没有交易。摆脱了线程,现在工作正常。如果是EJB,为什么要使用spring?如果您使用Spring,您需要添加
来告诉Spring使用@Transactional
做一些事情。在问题中添加bean代码,因为它看起来像是将EJB与Spring混合在一起。如果您使用的是EJB,那么就不应该尝试通过Spring注入entityManager。你用的是什么服务器?我已经用过了。我混合使用Spring(v4.0.6)和EJB3,并使用JBoss eap 6.3。我可以改为通过JNDI获取entityManager,但这对事务没有帮助。@djb如果类中有@Stateless
(问题中仍然缺少),则删除@Transactional
,并从Spring配置中删除所有与事务相关的条目,因为这是不需要的。还要确保您的数据源被设置为JTA,在JBoss中默认情况下不是这样。我确实有@无状态的,现在我已经删除了所有@Transactional,我的数据源是transaction type=“JTA”,并且定义了JTA数据源。但不,我同意它应该有效。也许问题在于代码位于驼峰路由的处理器内。但是链的所有部分在该代码之前都是无状态的。
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)