繁体   English   中英

JAVA Hibernate合并正在更新而不是合并

[英]JAVA Hibernate merge is updating and not merging

当我使用merge时,我希望休眠将不会将非null值复制到持久化的实体并更新数据库。 因此,在下面的用例中,我希望合并将保持lastName的值为Last_0并将firstName更改为值First_1

但是实际上,休眠只是在更新,这意味着在代码执行后, lastName变为null

    @Transactional
    public void create()  {
        SomeEntity create = new SomeEntity();
        create.setFirstName("First_0");
        create.setLastName("Last_0");
        this.getSession().save(create);
        //now in the database id:1, firstName:First_0, lastName:Last_0
   }


   @Transactional
    public void merge()  {
        SomeEntity merge = new SomeEntity();
        merge.setId(1);
        merge.setFirstName("First_1");
        this.getSession().merge(merge);
         // now in the database id:1, firstName:First_1, lastName:null
    }
    create();
    merge();

我希望lastName具有Last_0的值,因为它正在合并。 但它为空。

谢谢

您对在实践中如何实现Hibernate的merge()感到困惑。 在这种情况下, merge()是通过SQL UPDATE ,其含义类似于以下内容:

UPDATE some_entity
SET
    firstName = 'First_1',
    lastName = NULL
WHERE
    id = 1;

也就是说,它将使用您的分离实体碰巧拥有的任何内容覆盖所有字段值。 请注意,如果不存在具有此主键id=1记录,则Hibernate将INSERT ,而不是进行更新。

如果要开始使用实体的原始值,则应该使用get:

SomeEntity merge = (SomeEntity) this.getSession().get(SomeEntity.class, 1);
merge.setFirstName("First_1");
this.getSession().merge(merge);

现在,原始名称将“粘贴”,除了名字(被覆盖其他名称)之外。

如果您希望休眠仅保存部分字段,而并非所有字段都使用@DynamicUpdate

此处的示例: https : //www.baeldung.com/spring-data-jpa-dynamicupdate

如里面所贴:

实际上,当我们在实体上使用@DynamicUpdate时,Hibernate不会将缓存的SQL语句用于更新。 相反,每次我们更新实体时,它将生成一条SQL语句。 此生成的SQL仅包含已更改的列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM