我尝试在网上搜索此内容,但没有成功。有没有办法使用hibernate来执行幂等更新。
一种用例是使用 HTTP PUT 通过 REST API 更新数据库中的特定字段。例如,如果我有一个包含以下列的数据库:Id、Name、Phone、UpdateDate 并且我更新了Phone 字段(特定的Id)多次使用相同的值,只有我的第一个操作必须更新电话(并且还更改我的UpdateDate)。后续更新不得对记录(和UpdateDate)产生影响。
虽然这可以在应用程序中实现,方法是首先获取记录并将其与我的输入值进行比较,然后再执行更新。我想知道 Hibernate 是否有任何内置功能?
最佳答案
在 hibernate 中,如果您获取一个对象并尝试修改它的其中一个属性并提交事务。 Hibernate 将新值与旧值进行比较。仅当至少一个属性的新值与旧值不同时,才对实体的所有持久属性发出 UPDATE。
示例:
- 通过 ID 查找 EntityA。 Hibernate 为实体(以及任何非惰性多对一实体)发出 SELECT,并且它会记住原始值。
EntityA a = hibernateSession.find(EntityA.class, id);
- 在实体A上设置一些属性。
a.setPhone(newPhoneValue);
- 提交事务,触发
hibernateSession.flush()。
Hibernate 将新值与旧值进行比较。如果 propertyB 的新旧值不同,则对 x 的所有持久属性发出 UPDATE。
发出如下更新: UPDATEEntityA setphone=?, name=?, updateDate=?哪里 id=?
如果您愿意,可以使用dynamic-update和 dynamic-insert在映射中。
dynamic-update (optional - defaults to false): specifies that UPDATE SQL should be generated at runtime and can contain only those columns whose values have changed.
dynamic-insert (optional - defaults to false): specifies that INSERT SQL should be generated at runtime and contain only the columns whose values are not null.
将动态更新设置为 true 时,hibernate 将发出不带 name
列的 UPDATE
,因为它没有更改。
更新实体A设置电话=?,更新日期=?哪里 id=?
关于java - Hibernate 幂等更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7210947/