Java 刷新对象后的StaleObjectStateException

Java 刷新对象后的StaleObjectStateException,java,hibernate,persistence,staleobjectstate,Java,Hibernate,Persistence,Staleobjectstate,当我尝试提交会话时,另一个用户也更改了相同的对象,然后Hibernate抛出一个StaleObjectStateException 当我尝试从该异常中恢复时,我调用: session.refresh() 然后我再次调用之前失败的提交。但是在同一对象上再次出现staleObjectStateException。即使其他用户没有做任何更改,我也验证了对象的版本号与数据库中的版本号相同 有人知道可能出了什么问题吗? 有人对如何在不关闭和打开新会话的情况下优雅地处理异常有更好的想法吗 注意:我们为桌面(

当我尝试提交会话时,另一个用户也更改了相同的对象,然后Hibernate抛出一个
StaleObjectStateException

当我尝试从该异常中恢复时,我调用:

session.refresh()

然后我再次调用之前失败的提交。但是在同一对象上再次出现
staleObjectStateException
。即使其他用户没有做任何更改,我也验证了对象的版本号与数据库中的版本号相同

有人知道可能出了什么问题吗? 有人对如何在不关闭和打开新会话的情况下优雅地处理异常有更好的想法吗


注意:我们为桌面(RCP)应用程序使用单会话每视图实现

,正如您所提到的,它是一个长时间运行的会话,按照for
refresh()
方法

从基础数据库重新读取给定实例的状态。 不建议使用它来实现长时间运行的会话 跨越许多业务任务。然而,这种方法在某些情况下是有用的 特殊情况。例如 其中,数据库触发器在插入或更新时更改对象状态 在同一会话中执行直接SQL(如大规模更新)后 插入Blob或Clob后

我建议您改变在整个应用程序生命周期中使用单个会话的策略,并且仅当您需要与数据库交互时才使用session but transaction意味着打开会话,一旦完成,就关闭sesion


我不知道你有任何强迫使用长时间运行的会话,这只是一个建议

这是一个长时间运行的hibernate会话吗?@Santosh是的,这是一个长时间运行的版本:准确地说,它从应用程序的起始端开始,一直持续到应用程序关闭。我知道这不是全部,但它对我们有用…谢谢你的建议。我也红了Javadoc,看到了这个语句。但还有其他选择吗?我们使用长寿会话是因为我们希望重用hibernate查询的bean。我们不希望每次用户在UI中执行某些操作时都重新查询它们,只是为了从内存中有查询的那一刻起将查询量保持在较低(和较高的性能)…您可以使用二级缓存(二级缓存)。如果配置此选项,Hibernate将缓存查询的对象。签出链接