簡體   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