13

当我的应用程序中出现乐观并发问题时,我的应用程序中会抛出 StaleObjectStateException 而不是 OptimisticLockException(正如我所读到的那样,我应该期待这个)。无需发布代码,因为这是最基本的并发问题 - 时间戳列中的错误版本。

我应该如何获得 OptimisticLockException,而不是另一个?

4

2 回答 2

9

使用直接休眠 API 时会引发 StaleObjectStateException。如果您使用 JPA 样式休眠,则会引发 OptimisticLockException。如果这让您感到困惑,请阅读:JPA 和 Hibernate 之间有什么区别?

使用 try catch 块捕获异常:

try {
  // your hibernate operation here
} catch (OptimisticLockException e) {
  // do something (eg: inform user update is conflicting)
}

值得注意的是 OptimisticLockException 发生是因为在您有机会这样做之前,其他事务已更新(因此创建了更新版本的)对象。在 UI 应用程序中,通常会提示用户是否覆盖/丢弃/合并他/她的对象版本

于 2013-08-11T22:52:04.603 回答
1

根据我对 Hibernate 3.5.2(现在有点旧)的分析,我发现它们有时会抛出OptimisticLockException,有时会抛出StaleObjectStateException. 批处理操作甚至 throw StaleStateException,它是 的超类StaleObjectStateException,但没有实体实例。

在我看来,这是一个未完成的重构,您可能需要同时抓住两者并以相同的方式对两者做出反应。

于 2014-02-03T07:59:24.793 回答