Hibernate - 触发更新查询的排序

时间:2016-02-10 10:15:06

标签: hibernate

我有两个实体ENTAENTB有一对多关系。

我正在尝试更新java中的两条记录。 正在发生的更新顺序是:

update ENTA set column_name=? where id=ENTA1;
update ENTB set column_name=? where id=ENTB1;
update ENTB set column_name=? where id=ENTB2;
update ENTA set column_name=? where id=ENTA2;

我的问题是更新ENTB,我们有一个数据库触发器,用于计算ENTA表的一列中的值。

因此,对于第一条记录,更新正确。 但是对于第二条记录,触发器的更新被覆盖,因为更新的顺序已经改变了第二条记录,如上所示。

我尝试为ynamic-update="true"表执行d ENTA,但我的应用程序中的其他某些区域并未按预期工作。

我甚至尝试过hibernate的order_updates属性,但没有成功!

请您告诉我任何其他方式告诉hibernate按特定顺序更新它?

1 个答案:

答案 0 :(得分:0)

看看this answer。基本上,Hibernate中没有定义严格的更新顺序。碰巧当前的实现使用了将实体添加/加载到会话中的顺序(持久化上下文)。

这背后的原因是Hibernate看到在脏检查时发生了什么变化,当它将对象的当前状态与对象添加到会话时存储的快照进行比较时。 Hibernate不知道在执行脏检查之前你改变了对象的顺序。

hibernate.order_updates的目的是使update语句的批处理更有效(this blog中的更多详细信息),但与您的问题无关。

解决方案是在更改要首先更新的对象之后,但在更改其他对象之前手动刷新会话。例如,假设您希望在对实体A进行更改之前同步实体B的更改。行动的顺序应如下:

  1. 更改实例A
  2. 刷新会话。这会为update执行A语句。
  3. 更改实例B