PersistenceUnit vs PersistenceContext

use*_*971 48 java persistence jpa entitymanager java-ee

在我很少成功使用的项目中

@PersistenceUnit(unitName = "MiddlewareJPA")
EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();
Run Code Online (Sandbox Code Playgroud)

获取EntityManager数据库连接,但几天前我试图将我的项目移动到Jboss EAP 6.2它无法创建EntityManager.我在Google上搜寻它,我发现,我应该尝试改变@PersistenceUnit,以

@PersistenceContext(unitName = "MiddlewareJPA")
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)

获取EntityManager.它工作但我不知道为什么.有什么区别bettween PersistenceUnitPersistenceContext?每个人的利弊是什么?我们应该在哪里使用其中一个?

chr*_*ke- 71

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


Ale*_*eev 42

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

在一般情况下,最好是注入EntityManager,因为使用EntityManagerFactory@PersistenceUnit你应该EntityManager每次手动创建/销毁并管理交易.


Raj*_*Raj 11

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