通过@PersitenceContext或@PersitenceUnit注入EntityManagerFactory?

Leo*_*Leo 5 java jpa entitymanager

我一直认为@PersistenceContext用于将EntityManager注入到容器管理的应用程序中,而@PersistenceUnit用于注入EntityManagerFactory。

Javadoc 说

对于 PersistenceUnit ( http://docs.oracle.com/javaee/7/api/javax/persistence/PersistenceUnit.html )

表达对 EntityManagerFactory 及其关联的持久性单元的依赖关系。

对于PersistenceContext(http://docs.oracle.com/javaee/7/api/javax/persistence/PersistenceContext.html

表达对容器管理的 EntityManager 及其关联的持久性上下文的依赖关系。

到目前为止一切顺利,但后来我正在阅读 JPA 教程(请参阅https://docs.oracle.com/cd/E19798-01/821-1841/bnbqy/index.html),其中包含这样的示例

以下示例显示如何在使用应用程序管理的实体管理器的应用程序中管理事务:

@PersistenceContext
EntityManagerFactory emf;
EntityManager em;
@Resource
UserTransaction utx;
...
em = emf.createEntityManager();
try {
  utx.begin();
  em.persist(SomeEntity);
  em.merge(AnotherEntity);
  em.remove(ThirdEntity);
  utx.commit();
} catch (Exception e) {
  utx.rollback();
}
Run Code Online (Sandbox Code Playgroud)

那么如果我们谈论应用程序托管代码,PersistenceContext 也可以引用 EntityManagerFactory 吗?

免责声明——我猜与这个问题的答案无关——PersistenceUnit vs PersistenceContext

Pau*_*ski 4

我一直认为@PersistenceContext用于将EntityManager注入到容器管理的应用程序中,而@PersistenceUnit用于注入EntityManagerFactory。

这是真的。

我猜想 JPA 教程的例子是一个粗心的错误。之前在同一部分“应用程序管理的实体管理器”中写道

要获取 EntityManager 实例,首先必须通过 javax.persistence.PersistenceUnit 注解将其注入到应用程序组件中来获取 EntityManagerFactory 实例:

@PersistenceUnit EntityManagerFactory emf;

然后从EntityManagerFactory实例中获取EntityManager:

EntityManager em = emf.createEntityManager();