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.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 l' remove
opération de l'entité parente vers ses entités enfants.
Donc, si nous récupérons l' Post
entité parente avec sa comments
collection et supprimons l' 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
Les PostComment
entités enfants ont été supprimées en raison de la CascadeType.REMOVE
straté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' 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 l' Post
entité avec sa comments
collection et supprimons la première 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 la post_comment
ligne de table associée :
DELETE FROM post_comment
WHERE id = 2
Pour plus de détails sur ce sujet, consultez également cet article .