我试着通过网络搜索,但是徒劳。有没有一种方法可以使用hibernate来执行幂等更新。
一种用例是使用HTTP PUT通过REST API更新数据库中的特定字段。因此,例如,如果我有一个包含列: _ Id,Name,Phone,UpdateDate*_ 的数据库 _ ,_ 并且我多次用相同的值更新(特定 ID的 ) Phone ( 电话) 字段,那么只有我的第一个操作必须更新 Phone (并更改我的 UpdateDate )。后续更新必须对记录(和 UpdateDate )无效。 ***
虽然这可以在应用程序中实现,方法是先获取记录并将其与我的输入值进行比较,然后再执行更新。 我想知道Hibernate是否具有任何内置功能?
在hibernate状态下,如果您有一个对象并尝试修改其属性之一并提交事务。Hibernate将新值与旧值进行比较。 仅当至少一个属性的新值与旧值不同时 ,才对实体的所有持久性属性发出UPDATE 。
例:
EntityA a = hibernateSession.find(EntityA.class, id);
a.setPhone(newPhoneValue);
hibernateSession.flush().
发出如下更新: UPDATE entityA set phone=?, name=?, updateDate=? WHERE id=?
UPDATE entityA set phone=?, name=?, updateDate=? WHERE id=?
如果需要,可以在映射中使用dynamic- update和dynamic- insert。
动态更新(可选-默认为false):指定应在运行时生成UPDATE SQL,并且只能包含其值已更改的列。 动态插入(可选-默认为false):指定应在运行时生成INSERT SQL,并且仅包含其值不为null的列。
动态更新(可选-默认为false):指定应在运行时生成UPDATE SQL,并且只能包含其值已更改的列。
动态插入(可选-默认为false):指定应在运行时生成INSERT SQL,并且仅包含其值不为null的列。
将dynamic-update设置为true时,hibernate将发出UPDATE不包含该name列的a ,因为它没有更改。
UPDATE
name
UPDATE entityA set phone=?, updateDate=? WHERE id=?