java - 如何防止 Hibernate 在刷新时覆盖版本字段?
问题描述
我们的场景:
- JPA 实体被加载(通过 Hibernate)并传递给前端(包括实体的版本)。
- 用户修改数据,然后(可能几分钟后)修改后的实体数据从前端(FE)发送到后端(BE)(包括实体的 ID 和版本)。
- 在 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 对此进行了测试。
解决方案
推荐阅读
- geopandas - 使用 Geopandas 读取 Shapefile 时缺少列
- heatmap - 如何在r上的热图相关矩阵中取出两个变量
- timescaledb - 尝试设置 timescaledb-ha 版本
- python - 读取文本文件时如何更正列之间的空格?
- java - Java中的“按值传递”或“按引用传递”?
- flutter - 图像列表不显示在 Flutter-web 中
- java - ios | 出风头的罐子| APNs 网关拒绝通知:可选[InvalidProviderToken]
- git - GitHub Dropbox - 在计算机之间同步的最佳方式?
- angular - 以角度访问从子组件到父组件的输入
- swiftui - 我如何对数组进行排序(array.enumerated())