我们有一个已经使用 JPA 和 guice-persist 的现有 j2se 项目。现在,因为我们要添加 JMS 功能,所以需要 2-phase-commit 和 JTA。我们将使用 bitronix 事务管理器,因为没有容器(如 spring)。
据我了解,我们要做的第一件事就是将持久化单元的事务类型从RESSOURCE-LOCAL
更改为JTA
,因为我们希望数据库事务投票支持提交而不是提交。收集所有选票后,提交在第 2 阶段完成。
使用 guice-persist,我们将@Transactional
注解用于应该在单个事务中运行的方法。提供JPAPersistModule
了一个 EnitiyManagerFactory ,它用于 guice-persist 内部类,就像JpaLocalTxnInterceptor
包装了带注释的方法一样。
现在我得到了例外
java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
at org.hibernate.ejb.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:1009)
at com.google.inject.persist.jpa.JpaLocalTxnInterceptor.invoke(JpaLocalTxnInterceptor.java:57)
...
因为对提供的实体管理器的JpaLocalTxnInterceptor
调用。getTransaction()
我现在很困惑。有什么方法可以将 guice-persist 与 JTA 一起使用,或者我们真的必须从项目中删除 guice-persist 吗?或者,如果我们想做 JTA(使用 Bitronix),是否有任何替代 guice-persist 的方法?