PersistenceUnit vs PersistenceContext

时间:2014-01-10 07:45:28

标签: java java-ee jpa persistence entitymanager

在少数项目中我成功使用

@PersistenceUnit(unitName = "MiddlewareJPA")
EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();

获取EntityManager数据库连接,但几天前我尝试将项目移至Jboss EAP 6.2,但无法创建EntityManager。我正在谷歌搜索它,我发现我应该尝试将@PersistenceUnit更改为

@PersistenceContext(unitName = "MiddlewareJPA")
private EntityManager entityManager;

获取 EntityManager 。它有效,但我不知道为什么。 PersistenceUnitPersistenceContext之间有什么区别?每个人的利弊是什么?我们应该在哪里使用其中一个?

3 个答案:

答案 0 :(得分:60)

PersistenceUnit注入EntityManagerFactoryPersistenceContext注入EntityManager。除非您确实需要手动管理PersistenceContext生命周期,否则通常最好使用EntityManager

答案 1 :(得分:38)

我不知道它在Java EE中是如何工作的,但在Spring中,当您指定@PersistenceContext注释时,它会注入EntityManager。它在哪里获得EntityManager?通过调用EntityManager为整个应用程序生命周期创建一个EntityManagerFactory.createEntityManager()是错误的。因此,使用EntityManager接口的特殊实现并直接实例化。它有一个内部可变线程本地引用 real EntityManager。方法的实现只是将调用重定向到此 real EntityManager。并且有一个servlet侦听器,在每个请求之前通过调用EM获取EMF.createEntityManager()并将其分配给特殊EM的内部引用。此侦听器还通过调用 real getTransaction().begin()上的.commit().rollback()EM来管理交易。它是执行工作的非常简化的描述。而且我相信,JEE容器的功能和Spring一样。

一般情况下,最好注入EntityManager,因为EntityManagerFactory@PersistenceUnit每次都应该手动创建/销毁EntityManager并管理交易。< / p>

答案 2 :(得分:8)

通过 @PersistenceContext 获取的

EntityManager 称为容器管理 EntityManager ,因为容器将负责管理“ EntityManager ”。通过 @PersistenceUnit / entityManagerFactory.createEntityManager()获得的 EntityManager 由开发人员在应用程序中管理。 (例如,管理 EntityManager 的生命周期,释放EntityManager获取的资源等)。