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?
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. –
danke, sieht aus, als hätte ich dasselbe Problem zur selben Zeit gefunden :) – kiedysktos