Cette question étant très courante, cette réponse est basée sur cet article que j'ai écrit sur mon blog.
CascadeType.REMOVE
La CascadeType.REMOVEstraté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.ALLstratégie:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
vous permet de propager l' removeopération de l'entité parente vers ses entités enfants.
Donc, si nous récupérons l' Postentité parente avec sa commentscollection et supprimons l' postentité:
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
Les PostCommententités enfants ont été supprimées en raison de la CascadeType.REMOVEstratégie, qui a agi comme si nous supprimions également les entités enfants.
La stratégie d'élimination des orphelins
La stratégie de suppression des orphelins, qui doit être définie via l' orphanRemovalattribut:
@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 l' Postentité avec sa commentscollection et supprimons la première PostCommentde la commentscollection:
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 la post_commentligne de table associée :
DELETE FROM post_comment
WHERE id = 2
Pour plus de détails sur ce sujet, consultez également cet article .