Поскольку этот вопрос очень распространен, этот ответ основан на этой статье. я написал в своем блоге.
CascadeType.REMOVE
CascadeType.REMOVE
Стратегия, которую вы можете настроить в явном виде:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
или неявно унаследовать его от CascadeType.ALL
стратегии:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
позволяет размножать remove
операцию от родительской сущности на ее дочерние сущности.
Итак, если мы получим родительский Post
объект вместе с его comments
коллекцией и удалим post
объект:
Post post = entityManager.createQuery("""
select p
from Post p
join fetch p.comments
where p.id = :id
""", Post.class)
.setParameter("id", postId)
.getSingleResult();
entityManager.remove(post);
Hibernate выполнит три оператора удаления:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
В PostComment
дочерних объектах были удалены из-за CascadeType.REMOVE
стратегии, которая действовала , как если бы мы убрали дочерние объекты , а также.
Стратегия удаления сирот
Стратегия удаления сирот, которую необходимо установить с помощью orphanRemoval
атрибута:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
позволяет удалить строку дочерней таблицы при удалении дочернего объекта из коллекции.
Итак, если мы загрузим Post
сущность вместе с ее comments
коллекцией и удалим первую PostComment
из comments
коллекции:
Post post = entityManager.createQuery("""
select p
from Post p
join fetch p.comments c
where p.id = :id
order by p.id, c.id
""", Post.class)
.setParameter("id", postId)
.getSingleResult();
post.remove(post.getComments().get(0));
Hibernate будет выполнять оператор DELETE для связанной post_comment
строки таблицы:
DELETE FROM post_comment
WHERE id = 2
Для получения дополнительных сведений по этой теме ознакомьтесь также с этой статьей .