gpt4 book ai didi

java - 将 Guice Persist 与 JTA/bitronix 一起使用时出现问题

转载 作者:行者123 更新时间:2023-11-30 09:28:34 25 4
gpt4 key购买 nike

我们有一个已经使用 JPA 和 guice-persist 的现有 j2se 项目。现在,因为我们要添加 JMS 功能,所以需要两阶段提交和 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 的替代品?

最佳答案

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

我们不能将 Guice 与 Jooq 一起使用,所以我们:

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

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

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

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

像魅力一样工作!

乌杰

关于java - 将 Guice Persist 与 JTA/bitronix 一起使用时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13969932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com