3

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

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

session.refresh(<staleObject>)

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

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

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

4

1 回答 1

1

正如您所提到的,它是一个长时间运行的会话,根据方法的休眠文档refresh()

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

我建议您更改在应用程序生命周期中使用单个会话的策略,并且仅在需要与数据库交互并且完成后关闭会话时才使用会话但事务意味着打开会话。

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

于 2012-01-23T14:43:01.590 回答