我们有一个现有的J2SE项目,该项目已经使用了JPA和Guice-Persist。现在,由于我们想添加JMS功能,因此请求2阶段 - 命令和JTA。我们会使用Bitronix事务管理器,因为没有容器(例如春季)。
对我的理解,我们要做的第一件事是将持久性单位的交易类型从RESSOURCE-LOCAL
更改为JTA
,因为我们希望数据库交易转换为投票而不是>提交。该提交是在收集所有选票后在第二阶段完成的。
使用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
在提供的Entity Manager上调用getTransaction()
。
目前我很困惑。有什么方法可以将Guice-Persist与JTA或O一起使用,我们真的必须从该项目中删除Guice-Persist?或者,如果我们想做JTA(使用Bitronix),是否有任何替代者?
也有类似的情况。在我们的情况下,我们使用的是Guice Jooq。我们想要JOOQ,因为我们有一个巨大的遗产轨道DB,并且想要良好的控制加快速度。我们在春季选择了Guice,因为我们认为这是一个更好的框架,而且更快,我们喜欢编译时间检查。
我们不能与Jooq一起使用Guice,所以我们:
- 使用Atomikos JTA(免费版)
- 写了我们自己的 @transactional aop注释拦截器;
- 我们的可注射服务为我们的JOOQ处理器提供Java.sql.connection,但始终提供Atomikos DataSource Bean
我们基本修改了此代码:
http://www.dailyjavatips.com/2011/10/24/database-transactions-google-guice-aop/
因此,该示例使用常规JDBC TX,但是我们对其进行了修改,以便使用Atmomikos的JTA Aware TX。
工作就像魅力!
oje