gpt4 book ai didi

hibernate - 如何强制 Hibernate 在其实体之一发生更改时不将更改传播到数据库

转载 作者:行者123 更新时间:2023-12-04 05:18:58 27 4
gpt4 key购买 nike

Hibernate 对少数事情非常有用。但一件微不足道的事情就会远离注意力。我想提供一种在“管理面板”中修改数据库条目的方法。更具体地说,我想要一个能够修改的 View ,比如说,一个产品,它的属性,它的图像,它的价格等。因此,我加载了一个要修改的产品的编辑 View ,例如, session .get(Product.class, id)。然后我使用它的属性,修改名称,设置价格,加载图像并做任何我想做的事情。但最终用户必须决定是保存更改还是放弃更改。保存部分很容易 - 在服务层中使用事务调用 session.save,但丢弃似乎是一个更难的问题,因为任何后续 session 刷新都会将产品中取消的更改传播到数据库。

所以,我的问题是如何建立这样一个方案。什么是最好的选择?我个人看到以下解决方案:

  • 使用级联或
  • 调用 session.evict()
  • 使用一些复制副本/DTO 并合并保存操作或
  • 处理客户端上的所有更改,然后在保存时重新填充 hibernate 实体。
  • 最佳答案

    实际上,由于对 hibernate 持久性生命周期的误解,我搞砸了基本的 hibernate 功能。

    因此,采用的一种典型方法是拆分 (1) 通过调用 dao.load(key) 加载实体。方法并通过关闭关联的 session 将其从 session 中分离出来,为用户提供处理它的时间,(2) 用户修改表示层中的分离实体,以及 (3) 稍后将分离的对象重新附加到新 session ,使其持久化再次,如有必要,通过合并它,调用 dao.merge(object) .当然,可以使用 DTO 来不干扰不同的程序层。

    另一种明智的方法包括在一个 session 或事务中处理持久对象,在这种情况下,可以通过从 session 中驱逐对象来简单地取消更改,session.evict() ,或者通过回滚完整的事务,transaction.rollback() .

    如果像我这样的人遇到这样的误解,我的引用 list 将是:

  • Hibernate documentation on object states ;
  • Hibernate documentation on persistence contexts
  • A good hibernate review presentation on slidreshare .
  • 关于hibernate - 如何强制 Hibernate 在其实体之一发生更改时不将更改传播到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13893302/

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