java – 通过@PersitenceContext或@PersitenceUnit注入EntityManagerFactory?

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

Javadoc说

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

Expresses a dependency on an EntityManagerFactory and its associated persistence unit.

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

Expresses a dependency on a container-managed EntityManager and its associated persistence context.

到目前为止一直很好,但后来我正在阅读包含这样一个例子的JPA教程(见https://docs.oracle.com/cd/E19798-01/821-1841/bnbqy/index.html)

The following example shows how to manage transactions in an application that uses an application-managed entity manager:

@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();
}

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

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

最佳答案

I’ve always thought that @PersistenceContext was for injecting EntityManager into a container-managed application, while @PersistenceUnit was for injecting an EntityManagerFactory.

确实如此.

我想JPA教程的例子是一个粗心的错误.以前在同一部分“应用程序管理的实体经理”中编写了它

To obtain an EntityManager instance, you first must obtain an EntityManagerFactory instance by injecting it into the application component by means of the javax.persistence.PersistenceUnit annotation:

@PersistenceUnit
EntityManagerFactory emf;

Then obtain an EntityManager from the EntityManagerFactory instance:

EntityManager em = emf.createEntityManager();

点赞