当我试图提交我的会话,而另一个用户也更改了相同的对象时,Hibernate抛出一个StaleObjectStateException。
当我尝试从该异常中恢复时,我调用:
session.refresh(<staleObject>)
然后,我再次调用先前失败的提交。但是staleObjectStateException会再次出现在同一个对象上。即使其他用户没有进行任何更改,我也验证了对象的版本号与数据库中的版本号相同。
有人知道可能出了什么问题吗?对于如何在不关闭和打开新会话的情况下优雅地处理异常,有人有更好的想法吗?
注意:对于我们的桌面(RCP)应用程序,我们对每个视图实现使用一个会话
发布于 2012-01-23 22:43:02
正如您已经提到的,它是一个长时间运行的会话,根据refresh()方法的hibernate doc,
从底层数据库重新读取给定实例的状态。使用它来实现跨越许多业务任务的长时间运行的会话是不可取的。然而,这种方法在某些特殊情况下是有用的。例如,当数据库触发器在执行直接SQL之后插入或更新时改变对象状态(例如,在插入Blob或Clob之后的同一会话中进行批量更新
我建议您改变在整个应用程序生命周期中使用单个会话的策略,并使用会话但事务,这意味着只有在需要与数据库交互时才打开会话,并在完成后关闭sesion。
我不知道你有任何强制使用长时间运行会话的习惯,这只是一个建议。
https://stackoverflow.com/questions/8941859
复制相似问题