java - Hibernate 幂等更新

标签 java sql hibernate http-put idempotent

我尝试在网上搜索此内容,但没有成功。有没有办法使用hibernate来执行幂等更新。

一种用例是使用 HTTP PUT 通过 REST API 更新数据库中的特定字段。例如,如果我有一个包含以下列的数据库:Id、Name、Phone、UpdateDate 并且我更新了Phone 字段(特定的Id)多次使用相同的值,只有我的第一个操作必须更新电话(并且还更改我的UpdateDate)。后续更新不得对记录(和UpdateDate)产生影响。

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

最佳答案

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

示例:

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

发出如下更新: UPDATEEntityA setphone=?, name=?, updateDate=?哪里 id=?

如果您愿意,可以使用dynamic-updatedynamic-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/

相关文章:

java - 如何在不创建新日期的情况下在 Java 中获取系统时间

sql - ORA-01839 : date not valid for month specified, 如何避免闰年问题

sql - 限制多对多连接查询的结果

mysql - Hibernate c3p0配置

java - Hibernate、WebLogic 10.3 和 JPA 2.0

java - Guava 通用订购

java - java中如何添加和删除表

java - 如何获取操作系统和浏览器等客户端信息

SQL COUNT 条记录在表 2 JOINS 掉

java - 创建测试数据 : domain builder