hibernate (JPA): how to handle StaleObjectStateException when several object has been modified and commited

标签 hibernate optimistic-locking database-versioning database-concurrency

考虑以下场景: 一项数据库事务涉及不同表中的多行,并进行版本控制。

例如: 商店列表和产品。商店列表可能包含产品(及其在商店列表中的数量),并且产品具有当前库存。

当我插入或编辑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/

相关文章:

hibernate - jpa hibernate @ElementCollection

java - 持久化之前的 JPA @Version 值

sql-server - 使用 SQL Server 部署数据库更改的简单方法是什么?

cassandra - 在Cassandra中实现数据版本控制的方法

rest - ETag 和集合

database - 如何维护可与关系同时编辑的同一实体的两个版本?

java - 如何使用 Spring MVC 的单表继承获取子类属性

java - hibernate.hbm2ddl.auto 自动不添加新列

java - 如何在列注释中设置默认值

java - Hibernate乐观锁: Not getting any exception