CascadeType.REMOVE
El CascadeType.REMOVE
stratégie, que vous pouvez configurer explicitement :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
ou l'hériter implicitement de la CascadeType.ALL
stratégie :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
vous permet de propager le remove
de l'entité mère vers ses entités filles.
Donc, si nous récupérons le parent Post
ainsi que son comments
et supprimez la collection post
entité :
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 va exécuter trois instructions de suppression :
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
El PostComment
les entités enfant ont été supprimées à cause de la CascadeType.REMOVE
qui a agi comme si nous avions également supprimé les entités enfants.
La stratégie de suppression des orphelins
La stratégie de suppression des orphelins, qui doit être définie via l'option orphanRemoval
attribut :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
vous permet de supprimer la ligne de la table enfant lors de la suppression de l'entité enfant de la collection.
Donc, si nous chargeons le Post
ainsi que son comments
et supprimer le premier PostComment
de la comments
collection :
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 va exécuter une instruction DELETE pour les données associées. post_comment
ligne de table :
DELETE FROM post_comment
WHERE id = 2