您观察到的问题是数据的并发修改之一。Hibernate 有许多可能的解决方案来处理这个问题。
本质上,问题在于两个线程(或集群中的两台机器)同时作用于同一条数据。考虑这个例子:
machine 1: reads the data and returns it for editing somewhere else
machine 2: also reads the data for modification
machine 1: updates the data and commits.
machine 2: tries to do an update and commit.
当第二台机器尝试提交其更改时会发生什么?当机器 2 处理数据时,Hibernate 将看到数据已更改。也就是说,机器 2 的更新是在stale data上。Hibernate 不能总是合并这两个更改(也不是总是需要的行为),所以它通过抛出来拒绝第二次更新org.hibernate.StaleObjectStateException
正如我上面提到的,Hibernate 为您提供了许多解决此问题的选项。@Version
最简单的可能是在您的数据对象上添加一个版本字段。Hibernate 会自动维护数据的“版本”。每当发生更新时,Hibernate 会自动更改版本。您的工作是检查在读取数据和更新数据之间版本没有发生变化。如果它们不匹配,您可以采取一些措施来处理问题(即告诉用户)。有一些更复杂的技术可以防止并发更新,但这是最简单的。