当我的应用程序出现乐观并发问题时,我的应用程序中抛出StaleObjectStateException而不是OptimisticLockException(因为我读到我应该期待这个)。无需发布代码,因为它是最基本的并发问题 - 时间戳列中的错误版本。
我应该如何获得OptimisticLockException,而不是另一个?
答案 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
的超类,但没有实体实例。
在我看来,作为一个未完成的重构,你可能需要捕获两者并以同样的方式做出反应。