我一直认为@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();
}
所以如果我们在谈论应用程序托管代码,PersistenceContext也可以引用EntityManagerFactory吗?
免责声明 - 我猜这个问题与答案无关 - PersistenceUnit vs PersistenceContext
答案 0 :(得分:2)
我一直以为@PersistenceContext用于将EntityManager注入容器管理的应用程序,而@PersistenceUnit用于注入EntityManagerFactory。
这是真的。
我想JPA教程的例子是一个粗心的错误。以前在同一部分“应用程序管理的实体管理器”中编写了
要获取EntityManager实例,首先必须通过javax.persistence.PersistenceUnit注释将其注入应用程序组件来获取EntityManagerFactory实例:
@PersistenceUnit EntityManagerFactory emf;
然后从EntityManagerFactory实例获取EntityManager:
EntityManager em = emf.createEntityManager();