考虑以下场景:
一项数据库事务涉及不同表中的多个行并进行版本控制。
例如:
商店清单和产品。商店列表可能包含产品(及其在商店列表中的数量),并且产品具有当前库存。
当我插入或编辑 shopList 时,我希望更新 shopList 中这些产品的库存以保持库存一致。
为此,我打开一个事务,插入/更新 shopList,更新每个产品的库存(应用增量),然后提交事务。到现在为止还没什么大不了的。
然而,其他用户可能已经更新了一个或多个共同的产品。或者甚至更新了 shopList 本身。在这两种情况下,我在提交事务时都会收到 StaleObjectStateException。
问题是:有没有办法确定哪个表导致了 StaleObjectStateException?
如果产品导致异常,我可以从数据库刷新所有涉及的产品,然后重新应用库存增量。那很好。
如果 shopList 导致异常,最好将问题报告给用户,以便他可以重新开始。
非常感谢您的帮助。
我知道怎么做了。
首先要做的事情是:
JPA(或 hibernate 本身)将 org.hibernate.StaleObjectStateException 异常包装为 javax.persistence.OptimisticLockException。
因此,如果您想捕获正确的异常,请使用 OptimisticLockException。
第二:
只有在提交之前调用 EntityManager 的 Flush 方法时,hibernate 才会抛出 OptimisticLockException。如果你直接调用 Commit,你会得到另一个异常(我忘了是哪个)。考虑到几乎每个人都会捕获提交方法发出的异常并进行事务回滚,您将得到回滚相关的异常(再次记不清是哪个异常)。
第三次也是最后一次回答我原来的问题:
您只需从 OptimisticLockException 实例调用 getEntity 方法即可获取版本控制错误的来源。这将为您提供与此相关的任何您需要的东西。
感谢所有路过这里的人。
如有任何疑问,请提出,我很乐意提供帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)