【问题标题】:Trouble using Guice Persist together with JTA / bitronix将 Guice Persist 与 JTA / bitronix 一起使用时遇到问题
【发布时间】: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


    【解决方案1】:

    有类似的情况。在我们的例子中,我们使用的是 Guice + Jooq。我们想要 Jooq 是因为我们有一个大型的遗留 Rails DB 并且想要精细的控制和速度。我们之所以选择 Guice 而不是 Spring,是因为我们觉得它是一个更好的框架,而且速度更快,而且我们喜欢编译时检查。

    我们不能在 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 感知 Tx。

    像魅力一样工作!

    欧杰

    【讨论】:

    • 就我而言,我们更改了 DI 框架并现在使用 CDI。不是因为这个问题,而是因为决定将所有内容迁移到 J2EE 应用程序(JBoss -> CDI)。但是为 JTA 编写一个自定义拦截器看起来像是要走的路。感谢您的回答!
    • @Oje 你能提供一个可以理解这些步骤的存储库 GIT,pleeeese 吗? :)
    • @Alexian,那是一个公司私人 Git 帐户,我已签约,不再在那里工作!!上面链接中的示例与我们所做的非常相似,除了我们使用 Atomikos 数据源并在其上调用提交/回滚等而不是 JDBC 连接!抱歉,希望对您有所帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 2021-07-15
    • 2013-06-19
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多