当我尝试提交会话而另一个用户也更改了同一个对象时,Hibernate会抛出StaleObjectStateException
。
当我尝试从该异常中恢复时,我打电话给:
session.refresh(<staleObject>)
然后我再次调用之前失败的提交。但staleObjectStateException
再次出现在同一个对象上。即使其他用户没有进行任何更改,我也验证了该对象的版本号与我们数据库中的号码相同。
任何人都知道可能出错了什么? 有没有人更好地了解如何在不关闭和打开新会话的情况下优雅地处理异常?
注意:我们为桌面(RCP)应用程序使用每个View的单个会话实现
答案 0 :(得分:1)
正如您提到的一个长时间运行的会话,根据refresh()
方法的hibernate doc,
从底层数据库重新读取给定实例的状态。 不建议使用它来实现长时间运行的会话 跨越许多业务任务。然而,该方法在某些方面是有用的 特殊的情况。例如 数据库触发器在插入或更新时更改对象状态的位置 在同一会话中执行直接SQL(例如,批量更新)之后 插入Blob或Clob后
我建议你改变在整个应用程序生命周期中使用单个会话的策略,并且只有在需要与数据库交互时才使用会话但事务意味着打开会话,并且一旦完成,关闭sesion。
我不知道你使用长跑会话的任何强迫行为,这只是一个建议。