当我的应用程序中出现乐观并发问题时,我的应用程序中会抛出 StaleObjectStateException 而不是 OptimisticLockException(正如我所读到的那样,我应该期待这个)。无需发布代码,因为这是最基本的并发问题 - 时间戳列中的错误版本。
我应该如何获得 OptimisticLockException,而不是另一个?
当我的应用程序中出现乐观并发问题时,我的应用程序中会抛出 StaleObjectStateException 而不是 OptimisticLockException(正如我所读到的那样,我应该期待这个)。无需发布代码,因为这是最基本的并发问题 - 时间戳列中的错误版本。
我应该如何获得 OptimisticLockException,而不是另一个?
使用直接休眠 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 应用程序中,通常会提示用户是否覆盖/丢弃/合并他/她的对象版本
根据我对 Hibernate 3.5.2(现在有点旧)的分析,我发现它们有时会抛出OptimisticLockException
,有时会抛出StaleObjectStateException
. 批处理操作甚至 throw StaleStateException
,它是 的超类StaleObjectStateException
,但没有实体实例。
在我看来,这是一个未完成的重构,您可能需要同时抓住两者并以相同的方式对两者做出反应。