簡體   English   中英

刪除並保存Child:JPA

[英]Delete and save Child : JPA

這是我的實體:

@Entity
public class Parent {
    @Id
    @Column(name = "ID")
    private Long id;

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
    private Set<Child> childs = new HashSet<Child>();

 ...
}
The child:

@Entity
public class Child {
    @Id
    @Column(name = "ID")
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="PARENTID", nullable = false)
    private Parent parent;

  ...
}

我想執行以下操作:

  1. 從父級刪除子實體(不是父級本身)。
  2. 將新的子實體添加到父級( parent.setChild(child) )。
  3. 現在將子實體保存到DB中並相應地更新父實體。

這是我嘗試的但是它為父提出了ConstraintViolationexception

entityManager.remove(parent.getChild())
parent.setChild(new Child())
entityManager.merge(parent);

我怎樣才能解決這個問題?

“老”孩子可能仍然引用父母,而新孩子則沒有。 兩者都是一個問題。

除了刪除舊子項之外,還應將子實例的parent引用設置為null

除了將新子項添加到父項之外,還需要將父項添加到子項以提供外鍵。

不要從多方(孩子)到一方(父母)級聯。 此類級聯的行為未定義,可能以意外的方式工作。

編輯:JPA 2.0規范有什么說法:

請注意,應用程序負責維護運行時關系的一致性 - 例如,當應用程序在運行時更新關系時,確保雙向關系的“一”和“多”方彼此一致。

修改父級中的關系,如下所示:

    @OneToMany(cascade = {CascadeType.ALL}, orphanRemoval=true, mappedBy = "parent")

只需將新子項設置為父項並合並父項。 現在,之前引用的子項成為孤兒,JPA會在提交事務時自動刪除它們。

謝謝,JK

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM