持久化单元 vs 持久化上下文

57

在我的一些项目中,我已经成功地使用了

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

为了获取与数据库连接相关的EntityManager,但是几天前我尝试将我的项目移植到Jboss EAP 6.2,却无法创建EntityManager。我进行了搜索,并发现我应该尝试将@PersistenceUnit改为

要获取与数据库连接相关的EntityManager,但是几天前我尝试将我的项目迁移到Jboss EAP 6.2,却无法创建EntityManager。我进行了搜索,并发现应该尝试将@PersistenceUnit更改为

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

获取EntityManager。它可以工作,但我不知道为什么。 PersistenceUnitPersistenceContext之间有什么区别?每个选项的优缺点是什么?我们应该在哪里使用它们之一?


考虑采用CDI规范(JEE 6中的新规范)来进行依赖注入,这样你就有了一种更“通用”的方式来做它,而不是使用一堆API/框架特定的注解。在JEE 6本身中,这并没有真正提供对实体管理器注入的支持,但有记录的方法来处理这个问题。http://www.mastertheboss.com/cdi/cdi-and-jpa-tutorial - Gimby
2
作为现有答案的补充:这是一篇非常有用的文章,可以帮助回答OP的问题:JPA概念 - informatik01
3个回答

80

PersistenceUnit注入一个EntityManagerFactory,而PersistenceContext注入一个EntityManager。通常最好使用PersistenceContext,除非您真正需要手动管理EntityManager的生命周期。


1
但是如果我们有多个持久化单元,除了管理EntityManagerFactory之外,还有其他的方法吗? - raj240
回答@raj240的问题,我们可以使用相应持久化单元的名称来注入实体管理器@PersistenceContext(unitName = "MiddlewareJPA") - Rahul kalivaradarajalu

49
我不知道在Java EE中它是如何工作的,但在Spring中,当您指定@PersistenceContext注释时,它会注入EntityManager。它从哪里获取EntityManager?通过调用EntityManagerFactory.createEntityManager()为整个应用程序生命周期创建一个EntityManager是错误的。相反,使用特殊的EntityManager接口实现并直接实例化它。它有一个内部可变线程本地引用指向真正的EntityManager。方法的实现只是将调用重定向到这个真正的EntityManager。并且有一个servlet监听器,在每个请求之前通过调用EMF.createEntityManager()获得EM,并将其分配给特殊EM的内部引用。此监听器还通过在真正的EM上调用getTransaction().begin(),.commit()和.rollback()来管理事务。这是所执行工作的非常简化的描述。我相信JEE容器与Spring执行的操作相同。一般情况下最好注入EntityManager,因为使用EntityManagerFactory和@PersistenceUnit需要手动每次创建/销毁EntityManager,也需要管理事务。

注入的EntityManager是由Spring管理的。请参考此链接:https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#orm-jpa-dao - Abe

17

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


这是一篇关于J2EE的好文章: https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/entity-context.html - Abe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接