考虑这种情况:
Db事务涉及具有版本控制的不同表中的多行。

例如:
店铺清单和产品。当shopList可能包含产品(其数量在shoplist中)且产品具有其当前库存时。

当我插入或编辑shopList时,我希望shopList中那些产品的库存被更新以保持库存一致。

为此,我打开一个交易,插入/更新shopList,更新每种产品的库存(应用增量),然后提交交易。到目前为止,没什么大不了的。

但是,其他用户可能已经共同更新了一个或多个产品。甚至更新了shopList本身。在这两种情况下,提交事务时我都会得到StaleObjectStateException。

问题是:有没有一种方法可以确定哪个表导致了StaleObjectStateException?

万一产品引起异常,我可以从数据库刷新所有涉及的产品,然后重新应用库存增量。很好。
如果shopList导致了异常,最好将问题报告给用户,以便他可以重新开始。

非常感谢您的帮助。

最佳答案

我发现了。

第一件事:
JPA(或休眠本身)将org.hibernate.StaleObjectStateException异常包装为javax.persistence.OptimisticLockException。
因此,如果您想捕获正确的异常,请使用OptimisticLockException。

第二:
当您在提交之前调用EntityManager的方法Flush时,休眠状态只会抛出OptimisticLockException。如果直接调用Commit,则会得到另一个异常(我忘记了)。考虑到几乎每个人都可以捕获由commit方法发出的那些异常并进行事务回滚,您会得到与Rollback相关的异常(不再记得哪个异常)。

第三,最后回答我的原始问题:
您只需要从OptimisticLockException实例调用getEntity方法即可获取Versioning错误的来源。这将为您提供与此相关的任何内容。

感谢所有在这里路过的人。
对此有任何疑问,请提出,我们将很乐意为您提供帮助。

07-24 16:01