【问题标题】:best update strategy on hibernate stalestateExceptionhibernate stalestateException 上的最佳更新策略
【发布时间】:2012-01-12 08:38:02
【问题描述】:

我们正在使用带有乐观锁定的休眠。 我们所有的实体都有@version 注解。

这很好用,如果用户试图保存一个过时的对象,我们会得到一个 stalestateexception。 在我们的例子中,我们希望给用户一个通知屏幕来放弃他的更改或覆盖数据库中的当前值。

这是陈旧状态异常的常见用例。 我的问题与这个用例有关。如果用户决定用他的更改覆盖当前数据库行,最好的策略是什么?我已经浏览了休眠参考指南和不同的网站,但所有提到的事实是您必须自己捕获 stalestateexception,然后以编程方式处理数据的覆盖。 我想知道hibernate是否有一些实用程序来简化这个策略,如果用户决定用他的数据覆盖,我可以做的最简单的事情是从数据库中检索实体的最后一个版本,然后将所有更改的字段复制到这个对象和然后将更改的对象保存回数据库。 但我不禁想知道是否没有更优雅的解决方案。

【问题讨论】:

    标签: hibernate version state


    【解决方案1】:

    我认为 Hibernate 不会尝试帮助您解决这个问题,因为这方面的需求可能非常复杂和定制。

    我猜测,如果用户要保存已被另一个用户同时更改的对象,您很可能不想简单地加载该对象并复制所有更改的字段并撤消所有其他用户的更改。如果两个用户都更改了同一个字段会发生什么?您可能希望向用户展示这两个版本并要求他们决定哪个版本是正确的。有点像在版本控制系统中合并更改。

    此外,如果您只是在后端合并同一实体的两个版本并将其持久化,您可能还需要链接可能违反的字段的 UI 级别验证。

    【讨论】:

    • 在某些情况下,我们确实会创建一个“合并 ui”。但是在某些用例中,数据并不重要,只能被覆盖,我想知道是否有一些默认方法,或者您是否只需要自己编写算法。
    • 我不知道我害怕。
    • 这是一个很好的问题。我花了很多时间思考解决这种情况的最佳方法!
    【解决方案2】:

    根据我的经验,为了在这种情况下引入一些自动化,我曾经使用以下技巧。我重新加载了实体并将最后一个版本的值设置为我之前未能保存的陈旧对象。然后我做了merge() 传递了我的陈旧对象。这样,所有字段都会被覆盖,版本是最新的并可以保存。当然,所有相关的引用都必须以同样的方式处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2012-01-22
      • 2018-11-21
      • 2021-02-07
      相关资源
      最近更新 更多