2017-02-21 7 views
0

Ich lese viel Themen auf diesem und machte Hunderte von Experimenten, aber bisher keinen Erfolg. Ich habe folgende Klassen:Spring, JPA - bidirektionale @ OneToMany: Ersetzung der Kinderliste durch eine andere

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; 
} 

Was ich versuche ist children Liste mit dem in PATCH Anfrage zu ersetzen:

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); 

Verhalten folgt:

  • , wenn ich es laufen wie es ist, fügt es die neuen hinzu, aber hinterlässt die alten one! So habe ich wachsende Zahl von unerwünschten Kindern (sorry ..)
  • wenn ich kommentieren Teil ... der Elternteil ist entfernt!

Können Sie erklären, warum es sich so verhält und was kann ich hier tun?

+1

Weil das ist, was Sie konfiguriert haben ... Sie haben 'orphanRemoval = true' entfernt. Das Problem ist auch, dass Sie alles in einer Schleife kaskadieren. Entfernen Sie die Kaskade aus dem übergeordneten Feld im untergeordneten Objekt. –

+0

danke, sieht aus, als hätte ich dasselbe Problem zur selben Zeit gefunden :) – kiedysktos

Antwort

0

Lösung gefunden.

sollte ich orphanRemoval = true:

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

Jetzt ist es wegen der anderen Kaskade in @ManyToOne die Eltern gelöscht. Habe ich es zu folgenden:

@ManyToOne(cascade = {CascadeType.MERGE})

Jetzt funktioniert es.

Verwandte Themen