【发布时间】:2015-04-20 09:27:33
【问题描述】:
我可以打电话给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>
我的持久化单元说 transaction-type="JTA"
我正在通过
加载它@PersistenceContext
private EntityManager entityManager;
我已经尝试了一些事情,例如:entityManager.joinTransaction(),entityManager.getTransaction().begin()/.end(),@Resource UserTransaction 与 BEAN 事务管理,但它说我不能,与 JTA。只是没有交易正在进行。
我的方法有
@Transactional
@TransactionAttribute(TransactionAttributeType.REQUIRED)
它是一个 EJB,所以我很生气。 CMT JTA 应该自己做交易。
【问题讨论】:
-
如果它是 EJB 那么为什么要使用 spring?如果你使用 Spring,你需要添加
<tx:annotation-driven />来告诉 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 中默认情况下不是。 -
我确实有
@Stateless,现在我已经删除了所有 @Transactional ,我的数据源是 transaction-type="JTA" 并定义了 jta-data-source。但不是。我同意它应该工作。也许问题在于代码位于骆驼路线的处理器中。但是该链的所有部分都是@Stateless直到该代码。
标签: java spring jpa transactions jta