Hibernate Idempotent更新

时间:2011-08-26 21:55:27

标签: java sql hibernate http-put idempotent

我试着在网上搜索但是徒劳无功。有没有办法使用hibernate来执行幂等更新。

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

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

1 个答案:

答案 0 :(得分:3)

在hibernate中,如果你得到一个对象并尝试修改其中一个属性并提交事务。 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。
  4. 发布类似:UPDATE entityA set phone=?, name=?, updateDate=? WHERE id=?

    的更新

    如果您愿意,可以在映射中使用dynamic-updatedynamic-insert

      

    dynamic-update(可选 - 默认为false):指定UPDATE   SQL应该在运行时生成,并且只能包含那些列   其价值观发生了变化。

         

    dynamic-insert(可选 - 默认为false):指定INSERT   SQL应该在运行时生成,并且只包含其列的列   值不为空。

    如果动态更新设置为true,则hibernate会发出UPDATE而没有name列,因为它没有更改。

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