Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CMT JTA,但是;“没有正在进行的交易”;_Java_Spring_Jpa_Transactions_Jta - Fatal编程技术网

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)