在少数项目中我成功使用
@PersistenceUnit(unitName = "MiddlewareJPA")
EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();
获取EntityManager
数据库连接,但几天前我尝试将项目移至Jboss EAP 6.2
,但无法创建EntityManager
。我正在谷歌搜索它,我发现我应该尝试将@PersistenceUnit
更改为
@PersistenceContext(unitName = "MiddlewareJPA")
private EntityManager entityManager;
获取 EntityManager 。它有效,但我不知道为什么。 PersistenceUnit
和PersistenceContext
之间有什么区别?每个人的利弊是什么?我们应该在哪里使用其中一个?
答案 0 :(得分:60)
PersistenceUnit
注入EntityManagerFactory
,PersistenceContext
注入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)
EntityManager 称为容器管理 EntityManager ,因为容器将负责管理“ EntityManager ”。通过 @PersistenceUnit / entityManagerFactory.createEntityManager()获得的 EntityManager 由开发人员在应用程序中管理。 (例如,管理 EntityManager 的生命周期,释放EntityManager获取的资源等)。