Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate(JPA):当几个对象被修改和提交时,如何处理StaleObjectStateException_Hibernate_Optimistic Locking_Database Versioning_Database Concurrency - Fatal编程技术网

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

Hibernate(JPA):当几个对象被修改和提交时,如何处理StaleObjectStateException,hibernate,optimistic-locking,database-versioning,database-concurrency,Hibernate,Optimistic Locking,Database Versioning,Database Concurrency,考虑以下场景: 使用版本控制从不同表中包含多行的Db事务 例如: 一份购物清单和产品。如果购物清单可能包含产品(其数量在购物清单中),并且产品有其当前库存 当我插入或编辑购物清单时,我希望更新购物清单中这些产品的库存,以保持库存一致 为此,我打开一个事务,插入/更新购物清单,更新每个产品的库存(apply delta),然后提交事务。到目前为止没什么大不了的 但是,其他用户可能已经更新了一个或多个通用产品。甚至更新了购物清单本身。在这两种情况下,我在提交事务时都会得到StaleObjectSta

考虑以下场景: 使用版本控制从不同表中包含多行的Db事务

例如: 一份购物清单和产品。如果购物清单可能包含产品(其数量在购物清单中),并且产品有其当前库存

当我插入或编辑购物清单时,我希望更新购物清单中这些产品的库存,以保持库存一致

为此,我打开一个事务,插入/更新购物清单,更新每个产品的库存(apply delta),然后提交事务。到目前为止没什么大不了的

但是,其他用户可能已经更新了一个或多个通用产品。甚至更新了购物清单本身。在这两种情况下,我在提交事务时都会得到StaleObjectStateException

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

如果产品导致异常,我可以刷新数据库中所有已解决的产品,然后重新应用库存增量。那很好。 如果是购物清单导致了异常,最好是简单地向用户报告问题,这样他就可以重新开始

非常感谢您的帮助。

我找到了方法

第一件事: JPA(或hibernate本身)将org.hibernate.StaleObjectStateException异常包装为javax.persistence.OptimisticLockException。 因此,如果您想捕获正确的异常,请选择OptimisticLockException

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

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

谢谢所有路过这里的人。
关于这方面的任何问题,请提问,我很乐意提供帮助。

只有在调用session.flush时才会抛出异常,因此打满分。如果未调用它,它将作为回滚异常返回。在这个例外情况下,你不能对它做任何事情。你不能查询它的任何信息,因为它不包含任何信息。一定要打电话给同花顺。