У меня есть отношения:
Parent {
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "parent")
private List<Child> children= new ArrayList<>();
}
Child {
@ManyToOne
private Parent parent;
}
Я хочу удалить всех детей и добавить новых. Вот почему я звоню:
List<Child> newChildren = Arrays.asList(firstChild, secondChild);
parent.getChildren().clear();
parent.getChildren().addAll(newChildren);
parentRepository.save(parent); - I'm using spring data
Однако я видел, что когда я дважды вызываю вышеуказанный код (у меня более сложная логика, но это самый простой случай, когда я смог воспроизвести мою проблему) без вызова метода flush()
, Hibernate добавляет дубликаты в базу данных. (родитель будет иметь 4 детей):
parent.getChildren().clear();
parent.getChildren().addAll(newChildren);
parentRepository.save(parent);
parent.getChildren().clear();
parent.getChildren().addAll(newChildren);
parentRepository.save(parent);
Замена save
на saveAndFlush
исправляет приведенный выше код и приводит к тому, что у родителя только 2 дочерних элемента.
Почему необходимо вызывать метод flush перед удалением и вставкой новых дочерних элементов в родительский?