小编典典

休眠幂等更新

hibernate

我试着通过网络搜索,但是徒劳。有没有一种方法可以使用hibernate来执行幂等更新。

一种用例是使用HTTP PUT通过REST API更新数据库中的特定字段。因此,例如,如果我有一个包含列: _ Id,Name,Phone,UpdateDate*_ 的数据库 _ _ 并且我多次用相同的值更新(特定 ID的
Phone电话) 字段,那么只有我的第一个操作必须更新 Phone (并更改我的 UpdateDate
)。后续更新必须对记录(和 UpdateDate )无效。
***

虽然这可以在应用程序中实现,方法是先获取记录并将其与我的输入值进行比较,然后再执行更新。 我想知道Hibernate是否具有任何内置功能?


阅读 273

收藏
2020-06-20

共1个答案

小编典典

在hibernate状态下,如果您有一个对象并尝试修改其属性之一并提交事务。Hibernate将新值与旧值进行比较。 仅当至少一个属性的新值与旧值不同时
,才对实体的所有持久性属性发出UPDATE

例:

  1. 通过ID查找EntityA。Hibernate对该实体(以及任何非延迟的多对一实体)发出SELECT指令,并记住原始值。EntityA a = hibernateSession.find(EntityA.class, id);
  2. 在entityA上设置一些属性。 a.setPhone(newPhoneValue);
  3. 提交事务,触发hibernateSession.flush().Hibernate将新值与旧值进行比较。如果propertyB的旧值和新值不同,则对x的所有持久性属性发出UPDATE。

发出如下更新: UPDATE entityA set phone=?, name=?, updateDate=? WHERE id=?

如果需要,可以在映射中使用dynamic-
update
dynamic-
insert

动态更新(可选-默认为false):指定应在运行时生成UPDATE SQL,并且只能包含其值已更改的列。

动态插入(可选-默认为false):指定应在运行时生成INSERT SQL,并且仅包含其值不为null的列。

将dynamic-update设置为true时,hibernate将发出UPDATE不包含该name列的a ,因为它没有更改。

UPDATE entityA set phone=?, updateDate=? WHERE id=?

2020-06-20