2

我试图在网上搜索这个但徒劳无功。有没有办法使用休眠来执行幂等更新。

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

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

4

1 回答 1

3

在休眠状态下,如果您获得一个对象并尝试修改其中一个属性并提交事务。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=?

如果您愿意,可以在映射中使用动态更新动态插入。

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

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

将 dynamic-update 设置为 true 休眠将发出UPDATE没有name列的 a,因为它没有更改。

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

于 2011-08-26T23:08:57.677 回答