考虑这样的场景:一个Db事务使用版本控制包含来自不同表的多个行。
例如:A shopLists和products。其中shopList可能包含产品(其数量在商店行李表中),并且产品具有其当前库存。
当我插入或编辑shopList时,我想要更新shopList中这些产品的库存,以保持库存的一致性。
为此,我打开一个事务,插入/更新shopList,更新每个产品的股票(应用增量),然后提交事务。到目前为止没什么大不了的。
然而,其他用户可能已经共同更新了一个或多个产品。甚至更新了shopList本身。在这两种情况下,我在提交事务时都会得到一个StaleObjectStateException。
问题是:有没有办法确定是哪个表导致了StaleObjectStateException?
在产品导致异常的情况下,我可以刷新数据库中的所有封装产品,然后重新应用库存增量。这很好。在shopList导致异常的情况下,最好简单地将问题报告给用户,以便他可以重新开始。
非常感谢你的帮助。
发布于 2011-01-30 08:27:24
我知道怎么回事了。
首先要做的是: JPA (或hibernate本身)将org.hibernate.StaleObjectStateException异常包装为javax.persistence.OptimisticLockException。因此,如果您想捕获正确的异常,请使用OptimisticLockException。
第二:只有当你在提交前调用EntityManager的方法Flush时,hibernate才会抛出OptimisticLockException。如果你直接调用Commit,你会得到另一个异常(我忘了是哪一个)。考虑到几乎每个人都会捕获那些由commit方法发出的异常并执行事务回滚,您将获得与回滚相关的异常(不记得是哪一个了)。
第三,也是最后一个回答我最初的问题:您只需从OptimisticLockException实例调用getEntity方法来获取版本控制错误的根源。这将为您提供与此相关的任何需要的内容。
感谢所有路过这里的人。对此有任何问题,尽管问,我很乐意为您提供帮助。
https://stackoverflow.com/questions/4838786
复制相似问题