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

考虑一下场景: 一个Db事务,通过版本控制从不同的表中包含多行。 例如: 一个商店列表和产品。如果shopList可能包含产品(其数量在商店列表中)并且产品具有其当前库存。 当我插入ou编辑shopList时,我希望更新shopList中的那些产品的库存以保持库存一致。 为此,我打开一个事务,插入/更新shopList,更新每个产品的股票(应用delta),然后提交交易。到目前为止没什么大不了的。 但是,其他用户可能已经更新了一个或多个共同的产品。甚至更新了shopList本身。在这两种情况下,我都会在提交事务时得到StaleObjectStateException。 问题是:有没有办法确定哪个表导致StaleObjectStateException? 如果产品导致异常,我可以从数据库中刷新所有已包含的产品,然后重新应用库存增量。那没关系。 如果shopList导致异常,最好简单地向用户报告问题,以便他可以重新开始。 非常感谢您的帮助。     
已邀请:
我发现了怎么样。 首先要做的事情: JPA(或hibernate本身)将org.hibernate.StaleObjectStateException异常包装为javax.persistence.OptimisticLockException。 因此,如果要捕获正确的异常,请转到OptimisticLockException。 第二: 在提交之前调用EntityManager的方法Flush时,hibernate只会抛出OptimisticLockException。如果你直接调用Commit,你会得到另一个例外(我已经忘记了)。考虑到几乎所有人都抓住了commit方法发出的异常并进行了事务回滚,你将得到一个Rollback相关的异常(再也记不住了)。 第三,最后回答我原来的问题: 您只需从OptimisticLockException实例调用getEntity方法以获取Versioning错误的来源。这将为您提供与此相关的任何内容。 感谢所有经过这里的人。 有任何问题,请问,我很乐意提供帮助。     

要回复问题请先登录注册