@Inject和@PersistenceContext有什么区别?

时间:2013-05-16 22:09:26

标签: java jpa dependency-injection jboss-weld

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

@Inject EntityManager em;

以获得这样的对象。我在网上看到了很多代码片段,而不是使用:

@PersistenceContext EntityManager em;

这些选项有什么区别?

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

3 个答案:

答案 0 :(得分:7)

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

另一方面,

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

This article(这不完全是你所要求的苹果)可以为你提供更多的亮点。

如果您想直接了解@Inject的来源,you can read the spec here

  

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

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

但是,如果您碰巧有多个,您必须通过一些限定符注释并为您生成一些内容,或者您​​可以将unitName属性传递给{{1}注释。