首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate (JPA):当多个对象被修改和提交时如何处理StaleObjectStateException

Hibernate (JPA):当多个对象被修改和提交时如何处理StaleObjectStateException
EN

Stack Overflow用户
提问于 2011-01-30 02:55:15
回答 1查看 15.5K关注 0票数 4

考虑这样的场景:一个Db事务使用版本控制包含来自不同表的多个行。

例如:A shopLists和products。其中shopList可能包含产品(其数量在商店行李表中),并且产品具有其当前库存。

当我插入或编辑shopList时,我想要更新shopList中这些产品的库存,以保持库存的一致性。

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

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

问题是:有没有办法确定是哪个表导致了StaleObjectStateException?

在产品导致异常的情况下,我可以刷新数据库中的所有封装产品,然后重新应用库存增量。这很好。在shopList导致异常的情况下,最好简单地将问题报告给用户,以便他可以重新开始。

非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-30 08:27:24

我知道怎么回事了。

首先要做的是: JPA (或hibernate本身)将org.hibernate.StaleObjectStateException异常包装为javax.persistence.OptimisticLockException。因此,如果您想捕获正确的异常,请使用OptimisticLockException。

第二:只有当你在提交前调用EntityManager的方法Flush时,hibernate才会抛出OptimisticLockException。如果你直接调用Commit,你会得到另一个异常(我忘了是哪一个)。考虑到几乎每个人都会捕获那些由commit方法发出的异常并执行事务回滚,您将获得与回滚相关的异常(不记得是哪一个了)。

第三,也是最后一个回答我最初的问题:您只需从OptimisticLockException实例调用getEntity方法来获取版本控制错误的根源。这将为您提供与此相关的任何需要的内容。

感谢所有路过这里的人。对此有任何问题,尽管问,我很乐意为您提供帮助。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4838786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档