2017-02-21 93 views
0

我讀了很多的主題,並做了數百個實驗,但迄今尚未成功。我有以下類:Spring,JPA - 雙向@OneToMany:用另一個替換子列表

class Parent { 
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL/*, orphanRemoval=true*/) 
    private List<Child> children = new ArrayList<>(); 

class Child { 
    @ManyToOne(cascade = {CascadeType.ALL}) 
    @JoinColumn(name = "parentId", nullable = false) 
    @JsonIgnore 
    Parent parent; 
} 

我所做的就是儘量在PATCH請求中提供的一個替換children列表:

Hibernate.initialize(fromDb.getChildren()); 
    entityManager.detach(fromDb); // detach from JPA. I need this 

    List<Child> newChildren = fromClient.getChildren(); 

    fromDb.getChildren().clear(); // get rid of all old elements 

    for (Child child : newChildren) { // add the new ones 
     child.setParent(fromDb); 
     fromDb.getChildren().add(child); 
    } 

    ParentRepository.save(merged); 

行爲是以下幾點:

  • 當我運行它因爲它是,它增加了新的,但離開舊的 !所以我越來越多的多餘的孩子(對不起..)
  • 當我 取消註釋orphanRemoval=true部分... 父母被刪除

你能解釋爲什麼它的行爲如此嗎?我能在這裏做什麼?

+1

因爲這就是你配置它做的事情......你刪除了'orphanRemoval = true'。問題在於你在循環中將所有東西級聯起來。從子對象的父字段中刪除級聯。 –

+0

謝謝,看起來像我在同一時間自己找到同樣的問題:) – kiedysktos

回答

0

找到解決方案。

我應該有orphanRemoval =真:

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

現在它刪除,因爲在@ManyToOne其他級聯的父。我把它改成如下:

@ManyToOne(cascade = {CascadeType.MERGE})

現在,它的工作原理。

相關問題