gpt4 book ai didi

java - JPA : Extending the persistence context vs. 分离实体

转载 作者:搜寻专家 更新时间:2023-10-30 21:22:29 26 4
gpt4 key购买 nike

似乎有两种模式可以使用 JPA 实现跨越多个 http 请求的业务事务:

  1. entity-manager-per-request 与分离的实体
  2. 扩展持久性上下文

这些模式各自的优势是什么?什么时候应该首选哪个?

到目前为止,我想出了:

  • 扩展的持久性上下文保证对象身份等同于数据库身份,简化了编程模型并可能消除了为实体实现 equals 的需要
  • 分离的实体比扩展的持久性上下文需要更少的内存,因为持久性上下文还必须存储实体的先前状态以进行更改检测
  • 不再引用的分离实体有资格进行垃圾收集;必须首先显式分离持久对象

但是,由于没有任何 JPA 实践经验,我确信我错过了一些重要的东西,因此提出了这个问题。

以防万一:我们打算使用由 Hibernate 3.6 支持的 JPA 2.0。

编辑:我们的 View 技术是 JSF 2.0,在 EJB 3.1 容器中,带有 CDI 和可能的 Seam 3。

最佳答案

好吧,我可以列举尝试在 Web 环境中使用扩展持久性上下文的挑战。有些事情还取决于您的 View 技术是什么,以及它是绑定(bind)实体还是 View 级中间人。

  1. EntityManagers 不是线程安全的。您不需要每个用户 session 一个。每个用户 session 需要一个浏览器选项卡。
  2. 当异常出现时EntityManager,它被认为无效,需要关闭和更换。如果你打算编写自己的框架扩展用于管理延长的生命周期,这个的实现需要防弹。一般在一个EM-per-request 设置异常转到某种错误页面并然后加载下一页创建一个无论如何都会像往常一样新有。
  3. 对象平等不会100% 自动安全。如上,异常可能已经失效先前加载的对象的上下文与相关联,所以一个被提取现在将不平等。制作那个假设还假设一个极端高水平的技能和了解 JPA 的工作原理和新兴市场在其中做什么使用它的开发人员。例如。,不小心使用合并时不需要将返回一个新的不满足的对象 ==与其领域相同前任。 (将合并视为SQL“更新”是一个非常常见的JPA noobie'错误'特别因为它只是一个空操作时间就这么过去了。)
  4. 如果您使用的是 View 技术绑定(bind) POJO(例如 SpringMVC)并且您打算绑定(bind)网络表单数据直接到你的实体,你很快就会惹上麻烦的。对附加实体的更改将对下一个变得执着刷新/提交,无论是否他们是在交易中完成的,或者不是。常见的错误是,网络表单进来并绑定(bind)一些无效数据到一个实体上,验证失败并且尝试返回屏幕以通知用户。构建错误屏幕涉及运行查询。询问触发刷新/提交持久性语境。更改绑定(bind)到附加实体被刷新到数据库,希望导致 SQL 异常,但是也许只是持久化损坏的数据。

(如果编程草率,问题 4 当然也可能发生在每个请求的 session 中,但您不必为了避免它而被迫积极努力。)

关于java - JPA : Extending the persistence context vs. 分离实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com