在使用 JPA 的项目中,我通常使用
@Inject EntityManager em;
为了获得这样的对象。我看到网络上的许多代码片段改为使用:
@PersistenceContext EntityManager em;
这些选项有什么区别?
我的代码在 JBoss EAP 6.1 和 Hibernate 上运行。
在使用 JPA 的项目中,我通常使用
@Inject EntityManager em;
为了获得这样的对象。我看到网络上的许多代码片段改为使用:
@PersistenceContext EntityManager em;
这些选项有什么区别?
我的代码在 JBoss EAP 6.1 和 Hibernate 上运行。
@PersistenceContext
是一个特定的注释,它声明了对容器管理的实体管理器的依赖。它允许您指定更多参数,例如持久性类型。当您想要为有状态会话 bean 的整个生命周期维护持久性上下文时,将持久性类型设置为 EXTENDED 很重要。@PersistenceContext
是一个 JPA 注释。
@Inject
是 CDI 注释。它非常通用,可用于注入各种各样的对象。
@PersistenceContext是一个非常具体的注释,它说“用持久性上下文注入这个字段”。您不能在托管上下文之外使用它。
另一方面,@Inject非常通用。它说,“你应该注入这个领域。” 它不一定适用于持久性上下文,而是您想要定义为注入的任何内容。
这篇文章(这并不完全符合您的要求)可能会为您提供更多的信息。
如果您想直接了解 @Inject 的来源,可以在此处阅读规范:
@Inject,标识可以注入对 Java 类或接口的依赖项的点。然后容器提供所需的资源。在这个例子中,Login bean 指定了两个注入点。
@Inject
将为您提供容器认为的内容,EntityManager
希望只有一个。
但是,如果您碰巧有多个,则必须通过一些限定符注释并为您生成一些东西,或者您可以将unitName
属性传递给@PersistenceContext
注释。