首页 > 解决方案 > 如何防止 Hibernate 在刷新时覆盖版本字段?

问题描述

我们的场景:

  1. JPA 实体被加载(通过 Hibernate)并传递给前端(包括实体的版本)。
  2. 用户修改数据,然后(可能几分钟后)修改后的实体数据从前端(FE)发送到后端(BE)(包括实体的 ID 和版本)。
  3. 在 BE 上,再次从 DB 加载相应的实体,使用来自 FE(包括版本)的新值进行更新并保存到 DB。

问题:乐观锁定(并发修改检测)不起作用,因为版本属性以无法检测到并发修改的方式修改。

例如,实体在首次从数据库加载时的版本为 100。当 Alice 在 FE 上修改实体数据时(例如,30 分钟),实体被某个自动过程修改了五次,其版本增加到 105。当 Alice 完成更改时,应用程序发送修改后的数据到 BE。BE 从 DB 中加载相应的实体(现在是 105 版),并使用来自 FE 的值更新其属性,包括版本属性。因此托管实体已加载版本 105,但该版本后来显式更改为 100。现在,BE 调用EntityManager.merge(…)将数据保存到 DB。一旦调用了 JPA 刷新,版本字段就会增加,并且数据会保存到数据库中。

问题是,在刷新期间,版本没有增加到 101(如我所料)而是增加到 106。

这是正确的行为吗?我怎样才能让它按预期的方式工作?

我已经用 Hibernate 5.1.10 和 5.2.17 对此进行了测试。

标签: javahibernatejpa

解决方案


推荐阅读