Jpa EJB+;POJO助手+;实体管理员

Jpa EJB+;POJO助手+;实体管理员,jpa,jakarta-ee,ejb-3.0,ejb,jta,Jpa,Jakarta Ee,Ejb 3.0,Ejb,Jta,我正在使用EJB…我做了以下工作,我不知道为什么注入的EntityManager没有像人们预期的那样工作 EJB1在EJB2上调用写入DB的方法 当EJB2返回时,EJB1向MDB发送消息 MDB调用EJB3来读取数据库并执行一些工作 我的问题是,在所有3个带有@PersistenceContext的EJB中注入的EntityManager不能正常工作。在EJB2中调用persist()不会反映在EJB3中注入的EntityManager上。 可能有什么问题? 希望我把我的问题说清楚。 现在正在

我正在使用EJB…我做了以下工作,我不知道为什么注入的EntityManager没有像人们预期的那样工作

  • EJB1在EJB2上调用写入DB的方法
  • 当EJB2返回时,EJB1向MDB发送消息
  • MDB调用EJB3来读取数据库并执行一些工作 我的问题是,在所有3个带有@PersistenceContext的EJB中注入的EntityManager不能正常工作。在EJB2中调用persist()不会反映在EJB3中注入的EntityManager上。 可能有什么问题? 希望我把我的问题说清楚。 现在正在处理容器管理的事务

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

    在JavaEE环境中,常见的情况是使用事务范围的容器管理实体管理器。使用这样的实体管理器,持久性上下文将随着JTA事务的传播而传播

    在您的情况下,我怀疑您正在为EJB3的方法使用一个
    REQUIRES\u新的
    transaction属性。因此:

    • 调用
      EJB3#bar()
      时,容器将暂停为
      EJB2#foo()启动的事务,并启动一个新事务
    • EJB3#bar()
      调用实体管理器时,将创建一个新的持久化上下文
    • 由于为
      EJB2#foo()
      启动的事务尚未提交,因此新的持久性上下文无法“看到”更改
    PS:你真的在创建新的线程吗?如果是,请注意:这是EJB规范禁止的

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

    在JavaEE环境中,常见的情况是使用事务范围的容器管理实体管理器。使用这样的实体管理器,持久性上下文将随着JTA事务的传播而传播

    在您的情况下,我怀疑您正在为EJB3的方法使用一个
    REQUIRES\u新的
    transaction属性。因此:

    • 调用
      EJB3#bar()
      时,容器将暂停为
      EJB2#foo()启动的事务,并启动一个新事务
    • EJB3#bar()
      调用实体管理器时,将创建一个新的持久化上下文
    • 由于为
      EJB2#foo()
      启动的事务尚未提交,因此新的持久性上下文无法“看到”更改


    PS:你真的在创建新的线程吗?如果是,请注意:这是EJB规范禁止的。

    这是在使用JPA,对吗?我不太熟悉JPA,但我怀疑每个EJB都获得了不同的EntityManager实例。当您调用persist时,您确定它没有缓存实体并且它已提交到数据库中吗?即使实体在数据库中提交,它也可能不会显示在其他EntityManager实例中,除非您清除其缓存并重新加载所有实体。是的,使用JPA。不应该有新的EntityManager实例。使用@PersistenceContext的注入重用了由容器管理其生命周期的同一个EntityManager isntance。嗯,我相信会发生这种情况,我不是100%确定。每个EJB不是都有自己的persistence.xml文件吗?如果是这样的话,那不是意味着每个EJB都必须有自己的EntityManager实例吗?对不起,我认为这是不正确的,这是在使用JPA,对吗?我不太熟悉JPA,但我怀疑每个EJB都获得了不同的EntityManager实例。当您调用persist时,您确定它没有缓存实体并且它已提交到数据库中吗?即使实体在数据库中提交,它也可能不会显示在其他EntityManager实例中,除非您清除其缓存并重新加载所有实体。是的,使用JPA。不应该有新的EntityManager实例。使用@PersistenceContext的注入重用了由容器管理其生命周期的同一个EntityManager isntance。嗯,我相信会发生这种情况,我不是100%确定。每个EJB不是都有自己的persistence.xml文件吗?如果是这样的话,那不是意味着每个EJB都必须有自己的EntityManager实例吗?对不起,我认为这是不对的。谢谢你的回答。我会调查的。关于线程…刚刚将业务逻辑更改为MDB,避免了新线程…但问题仍然存在。@nico正如所暗示的,关于各种EJB方法的事务属性的一些详细信息可能会有所帮助。我认为支持类型可能适合我的情况。但是,我认为当我更改属性时,不会产生任何影响。这可能是因为我在hibernate配置xml中设置了JDBCTransactionFactory?我应该把它改成CMTTransactionFactory吗?@nico嗯,我想你应该提到所有相关的“细节”,比如这个。。。是的,我会在JavaEE上下文中使用CMTTransactionFactory。很抱歉。我是JavaEE平台的新手,正在不断地发现它。回到问题上来……我已经设置了CMTTransactionFactory,属性也正常工作。但是我无法使MDB中的entitymanager与用于在无状态EJB上写入DB的entitymanager保持一致,后者也在相同的业务方法上发送jms消息。谢谢您的回答。我会调查的。关于线程…刚刚将业务逻辑更改为MDB,避免了新线程…但问题仍然存在。@nico正如所暗示的,关于各种EJB方法的事务属性的一些详细信息可能会有所帮助。我认为支持类型可能适合我的情况。但是,我认为当我更改属性时,不会产生任何影响。这可能是因为我在hibern中设置了JDBCTransactionFactory