Jpa EJB3.x:具有EntityManagerFactory的扩展或事务范围的EnityManager

Jpa EJB3.x:具有EntityManagerFactory的扩展或事务范围的EnityManager,jpa,ejb,entitymanager,Jpa,Ejb,Entitymanager,试图找出一些可能的情况,当EntityManagerFactory在EJB中有用时。当然,通常只需要一个事务范围的EntityManager(JTA范围),以便所有注入的EntityManager共享相同的PersistenceContext。 在以下情况下会发生什么: 当使用@PersistenceContext(type=PersistenceContextType.EXTENDED)时:是否启用了JTA?此类实体管理者的请求是否会在JTA的上下文中执行?若否,是哪一项??(注意:当然,它只

试图找出一些可能的情况,当
EntityManagerFactory
在EJB中有用时。当然,通常只需要一个事务范围的
EntityManager
(JTA范围),以便所有注入的EntityManager共享相同的
PersistenceContext
。 在以下情况下会发生什么:

  • 当使用
    @PersistenceContext(type=PersistenceContextType.EXTENDED)
    时:是否启用了JTA?此类实体管理者的请求是否会在JTA的上下文中执行?若否,是哪一项??(注意:当然,它只适用于
    @Stateful
    ejb)。当然,很明显,在这种情况下,EntityManager将拥有自己的/特殊的PersistenceContext

  • 当使用
    @PersistenceUnit
    在EJB中获得
    Entitymanager工厂
    时(我想它可以在所有类型的EJB中工作,对吗?),获得的
    Entitymanager
    JTA是否已启用(当然
    Entitymanager.joinTransaction()
    是必需的)?如何从工厂获得事务范围(启用JTA)或扩展EntityManager?何时使用工厂而不是实体管理器是有用的。(当然,很明显EntityManagerFactory是Java SE应用程序到JPA的唯一接口,但是EJB呢?)


  • 您的问题围绕着这样一个假设,即您必须在EJB中注入@PersistenceUnit以获得EntityManagerFactory。好。。。让我在这里讲述一些缺失的背景:

    在servlet中 为了实例化EntityManager,我们必须遵循以下步骤:

  • 注入@PersistenceUnit以获得EntityManagerFactory
  • 使用以下行:entityManager=entityManagerFactory.createEntityManager() 以上两个步骤确保EntityManager是当前线程的本地线程,因此是线程安全的。这个场景是servlet在容器注入方面重新进入的一个解决方案。这意味着servlet将接受容器注入的现有EntityManager

    在EJB中 根据定义,EJB对于容器注入是不可重入的,因此我们知道容器将为EJB实例化一个新的entityManager代理,从而实现线程安全

    也就是说,我们可以讨论如何/何时使用ExtendedPersistenceContext 引用JPA规范第294页的JSR-317:

    容器管理的扩展持久性上下文只能在有状态会话bean的范围内启动。它存在于声明对PersistenceContextType.EXTENDED类型的实体管理器的依赖关系的有状态会话bean被创建时,并被称为绑定到有状态会话bean。。。 当有状态会话bean的@Remove方法完成时(或者有状态会话bean实例被销毁),容器关闭持久性上下文

    因此,可以使用PersistenceContextType.EXTENDED属性来破坏不可重入特性,该属性仅用于服务有状态会话bean语义。有状态会话bean必须维护同一个EntityManager,只要它存在

    总结 在你的第一个问题中:

    什么时候EntityManagerFactory在EJB中有用

    答案是:它没有用处


    至于你的第二个问题,我相信第一个答案和上面的背景叙述一开始就不需要问它了

    我建议买一本关于EJB的书。这个不错。如果您不理解其中的区别,您可能只想使用PersistenceContext。你很有可能知道你是否需要另一种选择。问题是什么?我看到了几个问题,其中一些是自我回答的,但并非全部都正确。什么时候在JEE应用程序中使用扩展持久性上下文是关键问题吗?@jahroy这是我读的书。只是想弄明白一些事情。到目前为止,我所需要的几乎都是
    @PersistenceContext
    注释。再次:我只是想弄明白一些事情…@kostja是的,我还有更多的问题。我希望对我的提问和我的问题的答案有一些确认/更正…@Sam谢谢你的回答。检查我是否理解正确:如果将
    EntityManager
    变量保存到Servlet中的静态变量中,以便在Servlet的其他线程中使用它(例如检查变量是否为null),则抛出一些意外异常的可能性很大?