【发布时间】:2012-12-20 10:21:05
【问题描述】:
我们有一个已经使用 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?
【问题讨论】:
标签: java jta guice-persist bitronix