【问题标题】:New a java object with same primary key, Hibernate merge() generate update sql instead of duplicate primary key新建一个主键相同的java对象,Hibernate merge() 生成更新sql而不是重复主键
【发布时间】:2020-11-05 16:09:01
【问题描述】:

在java中我创建了一个SalaryscaleDelinked对象,然后调用hibernate merge,成功保存到db。

然后我创建一个新的 SalaryscaleDelinked 对象,分配相同的 pk 但其他字段被更改,然后调用 hibernate 合并,我希望 hibernate 会抛出主键异常(因为它是具有相同 pk 的新对象),但它说

“onFlushDirty:检测到脏对象 com.frw.hdo.SalaryscaleDelinked@1c340517,id 为“04425”

并生成更新sql并使用相同的主键更新db记录。

  1. 为什么会这样?

  2. 使用什么hibernate方法或者什么情况下会导致上述场景抛出重复主键异常?

【问题讨论】:

    标签: java hibernate merge


    【解决方案1】:

    1- 正如心爱的 Vlad Mihalcea 所说,

    Hibernate 可以自动检测传入的更改并安排 SQL UPDATES on 我们的代表。这种机制称为自动脏检查。 这意味着 hibernate 知道该对象是您的实体,并且您正在对其调用 merge() ,因此您要求 hibernate 将您的更改更新到您自己的实体上。

    与 persist 方法一样,JSR-220 指定 merge 方法具有您可以依赖的某些语义(baeldung 站点):

    如果实体是分离的,它会复制到现有的持久实体上; 如果实体是瞬态的,则将其复制到新创建的持久实体上; 此操作对所有具有 cascade=MERGE 或 cascade=ALL 映射的关系进行级联; 如果实体是持久的,则此方法调用对其没有影响(但级联仍然发生)。 这就是您更新实体的原因。通过 Hibernate 脏检查的魔力。

    2- 如果您对该实体再次调用 save,您将收到所需的错误。

    【讨论】:

      猜你喜欢
      • 2017-10-24
      • 1970-01-01
      • 2023-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多