4

考虑以下场景:一个 Db 事务涉及来自不同表的多行,并带有版本控制。

例如:一个shopLists和products。shopList 可能包含产品(其数量在 shoplist 中)并且产品具有其当前库存。

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

为此,我打开一个事务,插入/更新 shopList,更新每个产品的库存(应用增量),然后提交事务。到现在也没什么大不了的。

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

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

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

非常感谢您的帮助。

4

1 回答 1

4

我发现了如何。

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

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

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

感谢所有路过这里的人。任何关于此的问题,只要问,我很乐意提供帮助。

于 2011-01-30T00:27:24.267 回答