使用GUICE与JTA / Bitronix一起使用麻烦



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

相关内容

  • 没有找到相关文章

最新更新