我试着在网上搜索但是徒劳无功。有没有办法使用hibernate来执行幂等更新。
一个用例是使用HTTP PUT通过REST API更新数据库中的特定字段。例如,如果我有一个包含列的数据库: Id,Name,Phone,UpdateDate ,我更新了手机字段 Id )多次使用相同的值,只有我的第一个操作必须更新手机(并且还要更改我的 UpdateDate )。后续更新必须对记录没有影响(并且 UpdateDate )。
虽然这可以在应用程序中实现,但首先获取记录并在执行更新之前将其与我的输入值进行比较。我想知道Hibernate是否有任何内置功能?
答案 0 :(得分:3)
在hibernate中,如果你得到一个对象并尝试修改其中一个属性并提交事务。 Hibernate将新值与旧值进行比较。仅当至少一个属性的新值与旧值不同时,才为实体的所有持久属性发出UPDATE。
示例:
EntityA a = hibernateSession.find(EntityA.class, id);
a.setPhone(newPhoneValue);
hibernateSession.flush().
Hibernate将新值与旧值进行比较。如果propertyB的旧值和新值不同,则为x的所有持久属性发出UPDATE。发布类似:UPDATE entityA set phone=?, name=?, updateDate=? WHERE id=?
如果您愿意,可以在映射中使用dynamic-update和dynamic-insert。
dynamic-update(可选 - 默认为false):指定UPDATE SQL应该在运行时生成,并且只能包含那些列 其价值观发生了变化。
dynamic-insert(可选 - 默认为false):指定INSERT SQL应该在运行时生成,并且只包含其列的列 值不为空。
如果动态更新设置为true,则hibernate会发出UPDATE
而没有name
列,因为它没有更改。
UPDATE entityA set phone=?, updateDate=? WHERE id=?