我有两个实体ENTA
与ENTB
有一对多关系。
我正在尝试更新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按特定顺序更新它?
答案 0 :(得分:0)
看看this answer。基本上,Hibernate中没有定义严格的更新顺序。碰巧当前的实现使用了将实体添加/加载到会话中的顺序(持久化上下文)。
这背后的原因是Hibernate看到在脏检查时发生了什么变化,当它将对象的当前状态与对象添加到会话时存储的快照进行比较时。 Hibernate不知道在执行脏检查之前你改变了对象的顺序。
hibernate.order_updates
的目的是使update
语句的批处理更有效(this blog中的更多详细信息),但与您的问题无关。
解决方案是在更改要首先更新的对象之后,但在更改其他对象之前手动刷新会话。例如,假设您希望在对实体A
进行更改之前同步实体B
的更改。行动的顺序应如下:
A
。update
执行A
语句。B
。