14

在使用 JPA 的项目中,我通常使用

@Inject EntityManager em;

为了获得这样的对象。我看到网络上的许多代码片段改为使用:

@PersistenceContext EntityManager em;

这些选项有什么区别?

我的代码在 JBoss EAP 6.1 和 Hibernate 上运行。

4

3 回答 3

8

@PersistenceContext是一个特定的注释,它声明了对容器管理的实体管理器的依赖。它允许您指定更多参数,例如持久性类型。当您想要为有状态会话 bean 的整个生命周期维护持久性上下文时,将持久性类型设置为 EXTENDED 很重要。@PersistenceContext是一个 JPA 注释。

@Inject是 CDI 注释。它非常通用,可用于注入各种各样的对象。

于 2014-02-01T15:24:01.503 回答
7

@PersistenceContext是一个非常具体的注释,它说“用持久性上下文注入这个字段”。您不能在托管上下文之外使用它。

另一方面,@Inject非常通用。它说,“你应该注入这个领域。” 它不一定适用于持久性上下文,而是您想要定义为注入的任何内容。

这篇文章(这并不完全符合您的要求)可能会为您提供更多的信息。

如果您想直接了解 @Inject 的来源,可以在此处阅读规范

@Inject,标识可以注入对 Java 类或接口的依赖项的点。然后容器提供所需的资源。在这个例子中,Login bean 指定了两个注入点。

于 2013-05-16T22:14:18.263 回答
1

@Inject将为您提供容器认为的内容,EntityManager希望只有一个。

但是,如果您碰巧有多个,则必须通过一些限定符注释并为您生成一些东西,或者您可以将unitName属性传递给@PersistenceContext注释。

于 2017-05-11T20:19:38.627 回答