Como essa pergunta é muito comum, essa resposta é baseada neste artigo que escrevi no meu blog.
CascadeType.REMOVE
A CascadeType.REMOVE
estratégia, que você pode configurar explicitamente:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
ou herde-o implicitamente da CascadeType.ALL
estratégia:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
permite que você propague a remove
operação da entidade pai para suas entidades filho.
Portanto, se buscarmos a Post
entidade pai junto com sua comments
coleção e removermos a post
entidade:
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);
O Hibernate irá executar três instruções de exclusão:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
As PostComment
entidades filhas foram excluídas por causa da CascadeType.REMOVE
estratégia, que atuou como se tivéssemos removido as entidades filhas também.
A estratégia de remoção de órfãos
A estratégia de remoção de órfãos, que precisa ser definida por meio do orphanRemoval
atributo:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
permite remover a linha da tabela filha ao remover a entidade filha da coleção.
Assim, se carregar a Post
entidade junto com sua comments
coleção e remover o primeiro PostComment
da comments
coleção:
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));
O Hibernate irá executar uma instrução DELETE para a post_comment
linha da tabela associada :
DELETE FROM post_comment
WHERE id = 2
Para obter mais detalhes sobre este tópico, consulte também este artigo .