Поскольку это очень распространенный вопрос, я написал эту статью , на которой основан этот ответ.
Переходы состояния объекта
JPA переводит переходы состояния сущности в операторы SQL, такие как INSERT, UPDATE или DELETE.

Когда вы являетесь persistсущностью, вы планируете выполнение оператора INSERT при EntityManagerсбросе, автоматически или вручную.
когда вы являетесь removeсущностью, вы планируете инструкцию DELETE, которая будет выполняться, когда сбрасывается контекст постоянства.
Каскадные переходы состояний объекта
Для удобства JPA позволяет распространять переходы состояний сущностей от родительских сущностей к дочерним.
Итак, если у вас есть родительский Postобъект, который @OneToManyсвязан с PostCommentдочерним объектом:

commentsКоллекция в Postсущности, отображается следующим образом :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Comment> comments = new ArrayList<>();
CascadeType.ALL
cascadeАтрибут сообщает поставщик JPA передать объект состояние перехода от родительского Postобъекта для всех PostCommentлиц , содержащихся в commentsколлекции.
Итак, если вы удалите Postсущность:
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
entityManager.remove(post);
Поставщик JPA собирается PostCommentсначала удалить объект, а когда все дочерние объекты будут удалены, он также удалит Postобъект:
DELETE FROM post_comment WHERE id = 1
DELETE FROM post_comment WHERE id = 2
DELETE FROM post WHERE id = 1
Удаление сирот
Когда вы устанавливаете orphanRemovalатрибут в true, поставщик JPA собирается планировать removeоперацию, когда дочерняя сущность удаляется из коллекции.
Итак, в нашем случае,
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
PostComment postComment = post.getComments().get(0);
assertEquals(1L, postComment.getId());
post.getComments().remove(postComment);
Поставщик JPA собирается удалить связанную post_commentзапись, поскольку на PostCommentобъект больше не ссылаются в commentsколлекции:
DELETE FROM post_comment WHERE id = 1
НА УДАЛЕННОМ КАСКАДЕ
ON DELETE CASCADEОпределяется на уровне FK:
ALTER TABLE post_comment
ADD CONSTRAINT fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
ON DELETE CASCADE;
Как только вы это сделаете, если вы удалите postстроку:
DELETE FROM post WHERE id = 1
Все связанные post_commentсущности автоматически удаляются ядром базы данных. Однако это может быть очень опасной операцией, если вы по ошибке удалите корневую сущность.
Вывод
Преимущество JPA cascadeи orphanRemovalопций заключается в том, что вы также можете воспользоваться оптимистичной блокировкой для предотвращения потери обновлений .
Если вы используете механизм каскадирования JPA, вам не нужно использовать уровень DDL ON DELETE CASCADE, что может быть очень опасной операцией, если вы удалите корневую сущность, которая имеет много дочерних сущностей на нескольких уровнях.
Для более подробной информации по этой теме, проверьте эту статью .