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.REMOVE
estrategia, que puede configurar explícitamente:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
o heredarlo implícitamente de la CascadeType.ALL
estrategia:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
le permite propagar la remove
operación de la entidad principal a sus entidades secundarias.
Entonces, si buscamos la Post
entidad padre junto con su comments
colección y eliminamos la post
entidad:
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 PostComment
entidades secundarias se eliminaron debido a la CascadeType.REMOVE
estrategia, 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 orphanRemoval
atributo:
@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 Post
entidad junto con su comments
colección y eliminamos la primera PostComment
de la comments
colecció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_comment
fila 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 .