Java Hibernate幂等更新

Java Hibernate幂等更新,java,sql,hibernate,http-put,idempotent,Java,Sql,Hibernate,Http Put,Idempotent,我试着在网上搜索,但没有成功。是否有一种方法可以使用hibernate执行幂等更新。 一个用例是使用HTTPPUT通过RESTAPI更新数据库中的特定字段。因此,例如,如果我有一个包含以下列的数据库:Id、Name、Phone、UpdateDate,并且我使用相同的值多次更新Phone字段(特定Id的),那么只有我的第一个操作必须更新Phone(并更改我的UpdateDate)。后续更新必须对记录(和UpdateDate)没有影响。 而这可以在应用程序中实现,方法是首先获取记录并在执行更新之

我试着在网上搜索,但没有成功。是否有一种方法可以使用hibernate执行幂等更新。 一个用例是使用HTTPPUT通过RESTAPI更新数据库中的特定字段。因此,例如,如果我有一个包含以下列的数据库:Id、Name、Phone、UpdateDate,并且我使用相同的值多次更新Phone字段(特定Id的),那么只有我的第一个操作必须更新Phone(并更改我的UpdateDate)。后续更新必须对记录(和UpdateDate)没有影响。
而这可以在应用程序中实现,方法是首先获取记录并在执行更新之前将其与输入值进行比较。我想知道Hibernate是否有任何内置功能?

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

例如:

  • 按id查找EntityA。Hibernate为实体(以及任何非惰性多对一实体)发出SELECT,并记住原始值<代码>EntityA=hibernateSession.find(EntityA.class,id)
  • 在entityA上设置一些属性<代码>a.setPhone(newPhoneValue)
  • 提交事务,触发
    hibernateSession.flush()。
    Hibernate将新值与旧值进行比较。如果propertyB的旧值和新值不同,则为x的所有持久属性发出更新
  • 发布更新,如:
    updateentitya set phone=?,name=?,updateDate=?其中id=?

    如果需要,可以在映射中使用和

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

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

    当动态更新设置为true时,hibernate将发出一个
    更新
    ,而不显示
    名称
    列,因为它没有更改


    updateentitya set phone=?,updateDate=?其中id=?

    如何设置UpdateDate?如果您手动设置并告诉Hibernate更新记录,则这将被视为记录的更新。@tkeE2036现在我正在通过程序手动执行此操作。所以,当有一个“放置”更新时,我会检查它是否是一个更改,如果是,我会更改日期。我以前从未尝试过动态更新。我会尝试一下。我有dynamic update true,但是当在触发器中调用更新查询时,hibernate在尝试更新所有字段后抛出异常。调用触发器时,hibernate如何以及为什么尝试运行查询?