Я прочитал много тем на этом и сделал сотни экспериментов, но пока никаких успехов. У меня есть следующие классы:Весна, 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;
}
Что я могу сделать, это попытаться заменить children
список с одной представленной в запросе PATCH:
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
часть ... родитель удален!
Можете ли вы объяснить, почему это так, и что я могу сделать здесь?
Потому что это то, что вы его настроили ... Вы удалили 'orphanRemoval = true'. Проблема в том, что вы все каскадируете в цикле. Удалите каскад из родительского поля в дочернем объекте. –
спасибо, похоже, что я нашел одну и ту же проблему самостоятельно в одно и то же время :) – kiedysktos