hibernate stalestateException的最佳更新策略

hibernate stalestateException的最佳更新策略,hibernate,version,state,Hibernate,Version,State,我们正在使用带有乐观锁定的hibernate。 我们所有的实体都有@version注释 这很好,如果用户试图保存过时的对象,我们会得到一个stalestateexception。 在本例中,我们希望给用户一个通知屏幕,以放弃其更改或覆盖数据库中的当前值 这是过时状态异常的常见用例。 我的问题与这个用例有关。如果用户决定用其更改覆盖当前数据库行,那么最好的策略是什么?我已经浏览了hibernate参考指南和不同的网站,但是提到的是,您必须自己捕获stalestateexception,然后通过编程

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

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

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

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

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


此外,如果您只是在后端合并同一实体的两个版本并将其持久化,则可能会有链接字段的UI级验证

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

在某些情况下,我们确实创建了“合并ui”。但是在一些用例中,数据不重要到可以被覆盖,我想知道是否有一些默认方法,或者你是否需要自己编写算法。恐怕我不知道。这是个好问题。我花了相当多的时间思考解决这种情况的最佳方法!