第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何使用 Spring Boot Data JPA 在一對(duì)多映射的子實(shí)體中設(shè)置 parentId

如何使用 Spring Boot Data JPA 在一對(duì)多映射的子實(shí)體中設(shè)置 parentId

慕標(biāo)琳琳 2021-12-10 15:20:41
用例:我們有一個(gè)-多個(gè)雙向關(guān)系,我們將收到更新為父級(jí)的請(qǐng)求,其中包含正在修改或未修改的子項(xiàng)。技術(shù)棧彈簧靴 2.0.2彈簧數(shù)據(jù) Jpa示例代碼:父類實(shí)體:package com.example.demo.model;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.OneToMany;import org.hibernate.annotations.DynamicInsert;import org.hibernate.annotations.DynamicUpdate;import lombok.Getter;import lombok.NoArgsConstructor;import lombok.Setter;@Getter@Setter@NoArgsConstructor@DynamicInsert@DynamicUpdate@Entitypublic class Parent {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    @Column(nullable = false)    private String a;    private String b;    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent")    private Set<Child> childs = new HashSet<>();    public void addChild(Child child) {        childs.add(child);        child.setParent(this);    }    public void removeChild(Child child) {        childs.remove(child);        child.setParent(null);    }    public void setChilds(            Set<Child> childrens) {        if (this.childs == null) {            this.childs = childrens;        }        else {            this.childs.retainAll(childrens);            this.childs.addAll(childrens);        }    }}通過(guò)上面的代碼,無(wú)法為子實(shí)體4設(shè)置父id,如果我們打印SQL日志,我們可以觀察到id為1的子被刪除,而id為3的子被插入,這是預(yù)期的。作為一種解決方法,我正在迭代所有子條目,如果未設(shè)置父條目,則手動(dòng)設(shè)置。我不想要這個(gè)額外的更新聲明。嘗試了其他方法,使用同步的 removeChild 方法刪除所有子條目,然后使用同步的 addChild 方法一一添加剩余的條目。這導(dǎo)致唯一約束失敗異常。需要什么? 執(zhí)行時(shí)在插入語(yǔ)句中設(shè)置父級(jí)而不是解決方法。
查看完整描述

1 回答

?
慕妹3146593

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊

問(wèn)題來(lái)自這部分:


Set<Child> childrens = new HashSet<>();

childrens.add(c3);

childrens.add(c4);

retrievedParent.setChilds(childrens);

您永遠(yuǎn)不需要重寫托管集合。

現(xiàn)在,根據(jù)您的設(shè)計(jì):

如果我們知道刪除了 c1 并添加了 c3,我們可以使用 Parent 中編寫的同步方法。

因?yàn)槲覀儾恢滥男┍粍h除,哪些被添加,因?yàn)槲覀儾粫?huì)從請(qǐng)求中獲取 id,將它們直接傳遞給 set 以讓 hibernate 將其處理為 equals 并且 Hashcode 已經(jīng)寫入。

如果客戶端向您發(fā)送了一組條目,則您需要自己進(jìn)行匹配,這意味著您需要:

  • 添加新元素

  • 刪除不再需要的元素

  • 更新現(xiàn)有的


查看完整回答
反對(duì) 回復(fù) 2021-12-10
  • 1 回答
  • 0 關(guān)注
  • 260 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)