EJB + POJO Helpers + EntityManager的问题

时间:2010-11-04 18:05:04

标签: jpa java-ee ejb-3.0 ejb jta

我正在使用EJB ...我执行以下操作并且我不知道为什么注入的EntityManager无法正常工作。

  1. EJB1调用EJB2上写入数据库的方法。
  2. 当EJB2返回时,EJB1向MDB发送消息。
  3. MDB调用读取数据库的EJB3并完成一些工作。
  4. 我的问题是,使用@PersistenceContext注入所有3个EJB的EntityManager无法正常工作。 EJB2中注入的EntityManager没有反映在EJB2中调用persist()。 可能有什么问题? 希望我的问题足够清楚。 现在使用Container托管交易。

1 个答案:

答案 0 :(得分:1)

  

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

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

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

  • 在调用EJB3#bar()时,容器将暂停为EJB2#foo()启动的事务并启动新事务
  • EJB3#bar()调用实体管理器时,将创建持久性上下文。
  • 由于EJB2#foo()的事务尚未提交,因此更改对新的持久性上下文不是“可见的”。
PS:你真的在创造新线程吗?如果是,请小提醒:EJB规范禁止这样做。