我们现有的j2se项目已经使用了JPA和guice-persist。现在,因为我们想要添加JMS功能,所以需要进行2阶段提交和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()
。
此刻,我很困惑。有没有办法和JTA一起使用guice-persist,或者我们真的要从项目中删除guice-persist?或者,如果我们想做JTA(使用Bitronix),是否有任何替代guice-persist?
答案 0 :(得分:2)
有类似的情况。在我们的例子中,我们使用的是Guice + Jooq。我们想要Jooq,因为我们有一个很大的传统Rails数据库,并希望精细控制和速度。我们选择了Guice而不是Spring,因为我们认为它是一个更好的框架,它更快,我们更喜欢编译时检查。
我们不能使用Guice坚持使用Jooq,所以我们:
我们基本上修改了这段代码:
http://www.dailyjavatips.com/2011/10/24/database-transactions-google-guice-aop/
因此该示例使用常规JDBC Tx,但我们对其进行了修改,因此它将使用Atmomikos的JTA感知Tx。
像魅力一样!
OJE