Dado que esta pregunta es muy común, esta respuesta se basa en este artículo que escribí en mi blog.
CascadeType.REMOVE
La CascadeType.REMOVEestrategia, que puede configurar explícitamente:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
o heredarlo implícitamente de la CascadeType.ALLestrategia:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
le permite propagar la removeoperación de la entidad principal a sus entidades secundarias.
Entonces, si buscamos la Postentidad padre junto con su commentscolección y eliminamos la postentidad:
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 ejecutará tres declaraciones de eliminación:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
Las PostCommententidades secundarias se eliminaron debido a la CascadeType.REMOVEestrategia, que actuó como si también elimináramos las entidades secundarias.
La estrategia de remoción de huérfanos
La estrategia de eliminación de huérfanos, que debe establecerse mediante el orphanRemovalatributo:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
le permite eliminar la fila de la tabla secundaria al eliminar la entidad secundaria de la colección.
Entonces, si cargamos la Postentidad junto con su commentscolección y eliminamos la primera PostCommentde la commentscolección:
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 ejecutará una instrucción DELETE para la post_commentfila de la tabla asociada :
DELETE FROM post_comment
WHERE id = 2
Para obtener más detalles sobre este tema, consulte también este artículo .