如何防止Hibernate在flush上覆盖版本字段?

时间:2018-05-31 08:24:00

标签: java hibernate jpa

我们的情景:

  1. JPA实体被加载(通过Hibernate)并传递给前端(包括实体的版本)。
  2. 用户修改数据然后(可能在几分钟后),修改后的实体数据从前端(FE)发送到后端(BE)(包括ID和实体版本) )。
  3. 在BE上,再次从数据库加载相应的实体,使用来自FE(包括版本)的新值进行更新并保存到数据库中。
  4. 问题:乐观锁定(并发修改检测)不起作用,因为版本属性的修改方式使得无法检测到并发修改。

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

    问题在于,在刷新期间,版本不会增加到101(正如我预期的那样),而是增加到106.

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

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

0 个答案:

没有答案