我们正在使用带有乐观锁定的hibernate。 我们所有的实体都有@version注释。
这很好用,如果用户试图保存一个陈旧的对象,我们会得到一个stalestateexception。 在我们的例子中,我们希望为用户提供一个通知屏幕,以丢弃他的更改或覆盖数据库中的当前值。
这是陈旧状态异常的常见用例。 我的问题与此用例有关。如果用户决定用他的更改覆盖当前数据库行,那么最佳策略是什么?我已经浏览了hibernate参考指南和不同的网站,但所有提到的事实是你必须自己捕获stalestateexception然后programmaticaly处理数据的覆盖。 我想知道hibernate是否有一些实用程序来简化这个策略,如果用户决定用他的数据覆盖从数据库中检索实体的最后一个版本然后将所有更改的字段复制到此对象,我可以忍受的最简单的事情然后将更改的对象保存回数据库。 但我不禁想知道是否有更优雅的解决方案。
答案 0 :(得分:2)
我认为Hibernate不会试图帮助你解决这个问题,因为这方面的要求可能非常复杂和定制。
我猜测如果用户要保存另一个用户同时更改的对象,则您很可能不想简单地加载该对象并复制所有已更改的字段并撤消所有其他用户更改。如果两个用户都改变了同一个字段会怎样?您可能希望向用户提供这两个版本,并要求他们确定哪个版本是正确的。有点像合并版本控制系统中的更改。
此外,您可能还有UI级别验证,如果您只是在后端合并同一实体的两个版本并将其保留,则可以链接可能违反的字段。
答案 1 :(得分:0)
根据我的经验,在这种情况下引入一些自动化我曾经做过以下技巧。我重新加载了实体并将最后一个版本的值设置为我之前未能保存的陈旧对象。然后我做了merge()
传递我陈旧的对象。这样,所有字段都会被覆盖,版本是最新的并准备保存。当然,所有相关的参考文献必须以同样的方式处理。