实现跨多个HTTP请求的业务事务,JPA似乎有两种模式:
- 每个请求一个实体管理器,并使用脱离的实体
- 扩展持久性上下文
这些模式各自有哪些优点?应该在什么情况下选择哪种模式?
到目前为止,我想到了以下几点:
- 扩展持久性上下文确保对象标识等同于数据库标识,简化编程模型,可能消除了实现实体equals方法的需要
- 与扩展持久性上下文相比,脱离的实体需要更少的内存,因为持久性上下文还必须存储实体的先前状态以进行更改检测
- 不再被引用的脱离实体可以进行垃圾回收;持久对象必须首先显式地脱离
然而,由于我没有使用过JPA,所以我肯定错过了一些重要的东西,因此提出了这个问题。
如果有影响的话:我们打算使用由Hibernate 3.6支持的JPA 2.0。
编辑:我们的视图技术是JSF 2.0,在EJB 3.1容器中使用CDI,可能还有Seam 3。