我们正在使用带有乐观锁定的 hibernate 。
我们所有的实体都有@version 注释。
这很好用,如果用户试图保存一个过时的对象,我们会得到一个 stalestateexception。
在我们的例子中,我们希望给用户一个通知屏幕来放弃他的更改或覆盖数据库中的当前值。
这是陈旧状态异常的常见用例。
我的问题与这个用例有关。如果用户决定用他的更改覆盖当前数据库行,最好的策略是什么?我已经浏览了 hibernate 引用指南和不同的网站,但所有提到的事实是您必须自己捕获 stalestateexception,然后以编程方式处理数据的覆盖。
我想知道 hibernate 是否有一些实用程序来简化这个策略,如果用户决定用他的数据覆盖,我可以做的最简单的事情是从数据库中检索实体的最后一个版本,然后将所有更改的字段复制到这个对象和然后将更改的对象保存回数据库。
但我不禁想知道是否有更优雅的解决方案。
最佳答案
我认为 Hibernate 不会试图帮助您解决这个问题,因为这方面的需求可能非常复杂和定制。
我猜测,如果用户要保存已被另一个用户同时更改的对象,您很可能不想简单地加载该对象并复制所有更改的字段并撤消所有其他用户的更改。如果两个用户更改了同一个字段,会发生什么情况?您可能希望向用户展示这两个版本并要求他们决定哪个版本是正确的。有点像合并版本控制系统中的更改。
此外,如果您简单地在后端合并同一实体的两个版本并保留它,您也可能有 UI 级别验证链接可能被违反的字段。
关于hibernate - hibernate stalestateException 的最佳更新策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8832101/