在使用JPA的项目中,我通常使用
@Inject EntityManager em;
以获得这样的对象。我在网上看到了很多代码片段,而不是使用:
@PersistenceContext EntityManager em;
这些选项有什么区别?
我的代码在JBoss EAP 6.1和Hibernate上运行。
答案 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}注释。