StaleObjectStateException vs OptimisticLockException

时间:2013-08-11 21:35:31

标签: hibernate exception concurrency optimistic-concurrency

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

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

2 个答案:

答案 0 :(得分:9)

使用直接hibernate API时会抛出StaleObjectStateException。如果您使用JPA样式的hibernate,则抛出OptimisticLockException。如果这让您感到困惑,请阅读:What's the difference between JPA and Hibernate?

使用try catch块来捕获异常:

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

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

答案 1 :(得分:1)

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

在我看来,作为一个未完成的重构,你可能需要捕获两者并以同样的方式做出反应。