Допустим, у нас есть две сущности, A и B. B имеет отношение «многие-к-одному» с A, как показано ниже:
@Entity
public class A {
@OneToMany(mappedBy="a_id")
private List<B> children;
}
@Entity
public class B {
private String data;
}
Теперь я хочу удалить объект A и каскадировать удаления для всех его дети (B). Это можно сделать двумя способами:
1) Добавить cascade = CascadeType.ALL, orphanRemoval = true
в аннотацию OneToMany, позволяя JPA удалить всех дочерних элементов перед удалением A-объекта из базы данных.
2) Оставьте классы такими, какие они есть, и просто позвольте базе данных каскадировать удаление.
Есть ли какие-либо проблемы с использованием более позднего варианта? Заставит ли это Entity Manager сохранять ссылки на уже удаленные объекты? Моя причина выбора второго варианта вместо первого заключается в том, что первый вариант генерирует n + 1 SQL-запросов для удаления, что может занять длительное время, когда объект A содержит много дочерних элементов, в то время как второй вариант генерирует только один запрос SQL, а затем благополучно продолжается. Есть ли какие-либо «лучшие практики» в этом отношении?