考虑以下场景: 一项数据库事务涉及不同表中的多行,并进行版本控制。
例如: 商店列表和产品。商店列表可能包含产品(及其在商店列表中的数量),并且产品具有当前库存。
当我插入或编辑shopList时,我希望更新shopList中这些产品的库存以保持库存一致。
为此,我打开一个事务,插入/更新 shopList,更新每个产品的库存(应用增量),然后提交事务。到目前为止还没有什么大不了的。
但是,其他用户可能更新了一个或多个共同产品。或者甚至更新了 shopList 本身。在这两种情况下,我都会在提交事务时收到 StaleObjectStateException。
问题是:有没有办法确定哪个表导致了 StaleObjectStateException?
如果产品导致异常,我可以从数据库刷新所有涉及的产品,然后重新应用库存增量。那很好。 如果 shopList 导致异常,最好将问题报告给用户,以便他可以重新开始。
非常感谢您的帮助。
最佳答案
我知道怎么做了。
首先要做的事情是: JPA(或 hibernate 本身)将 org.hibernate.StaleObjectStateException 异常包装为 javax.persistence.OptimisticLockException。 因此,如果您想捕获正确的异常,请使用 OptimisticLockException。
第二: 只有在提交之前调用 EntityManager 的方法 Flush 时,hibernate 才会抛出 OptimisticLockException。如果你直接调用 Commit,你会得到另一个异常(我忘了是哪个)。考虑到几乎每个人都会捕获提交方法发出的异常并进行事务回滚,您将得到回滚相关的异常(再次记不清是哪个异常)。
第三次也是最后一次回答我原来的问题: 您只需从 OptimisticLockException 实例调用 getEntity 方法即可获取版本控制错误的来源。这将为您提供与此相关的任何所需内容。
感谢所有路过这里的人。 如有任何疑问,请提出,我很乐意提供帮助。
关于 hibernate (JPA): how to handle StaleObjectStateException when several object has been modified and commited,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4838786/