慕標(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)有的
添加回答
舉報(bào)
0/150
提交
取消