1

我正在使用 EJB...我执行以下操作,但我不知道为什么注入的 EntityManager 没有按预期工作。

  1. EJB1 在 EJB2 上调用一个写入 DB 的方法。
  2. 当 EJB2 返回时,EJB1 向 MDB 发送一条消息。
  3. MDB 调用 EJB3 读取 DB 并做一些工作。

我的问题是使用 @PersistenceContext 注入所有 3 个 EJB 的 EntityManager 无法正常工作。在 EJB2 中调用 persist() 不会反映在 EJB3 中注入的 EntityManager 上。可能有什么问题?希望我把我的问题说清楚了。现在使用容器管理的事务。

4

1 回答 1

1

我的问题是使用 @PersistenceContext 注入所有 3 个 EJB 的 EntityManager 无法正常工作。在 EJB2 中调用 persist() 不会反映在 EJB3 中注入的 EntityManager 上。

在 Java EE 环境中,常见的情况是使用 Transaction-Scoped Container-Managed entity manager。使用这样的实体管理器,持久性上下文会随着 JTA 事务的传播而传播。

在您的情况下,我怀疑您正在REQUIRES_NEW为 EJB3 的方法使用事务属性。所以:

  • 调用时EJB3#bar(),容器将暂停已启动的事务EJB2#foo()并启动新事务
  • 从 调用实体管理器时,将创建EJB3#bar()一个新的持久性上下文。
  • 由于开始的事务EJB2#foo()尚未提交,因此更改对新的持久性上下文不是“可见的”。

PS:你真的在创建新线程吗?如果是,请稍加提醒:这是 EJB 规范所禁止的。

于 2010-11-08T14:34:51.673 回答