Должен ли я разрешить каскадное удаление JPA или базы данных?

Допустим, у нас есть две сущности, 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, а затем благополучно продолжается. Есть ли какие-либо «лучшие практики» в этом отношении?

12
задан Rasmus Franke 26 April 2011 в 09:29
поделиться