麻烦使用Guice Persist和JTA / bitronix

时间:2012-12-20 10:21:05

标签: java jta guice-persist bitronix

我们现有的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?

1 个答案:

答案 0 :(得分:2)

有类似的情况。在我们的例子中,我们使用的是Guice + Jooq。我们想要Jooq,因为我们有一个很大的传统Rails数据库,并希望精细控制和速度。我们选择了Guice而不是Spring,因为我们认为它是一个更好的框架,它更快,我们更喜欢编译时检查。

我们不能使用Guice坚持使用Jooq,所以我们:

  • 使用Atomikos JTA(免费版)
  • 写了我们自己的@Transactional AOP注释拦截器;
  • 我们的injectable Service为我们的jooq处理器提供java.sql.Connection,但始终提供Atomikos DataSource bean

我们基本上修改了这段代码:

http://www.dailyjavatips.com/2011/10/24/database-transactions-google-guice-aop/

因此该示例使用常规JDBC Tx,但我们对其进行了修改,因此它将使用Atmomikos的JTA感知Tx。

像魅力一样!

OJE