Bu soru çok yaygın olduğu için bu cevap blogumda yazdığım bu makaleye dayanmaktadır .
CascadeType.REMOVE
CascadeType.REMOVEAçıkça yapılandırabilirsiniz strateji,:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
veya dolaylı olarak CascadeType.ALLstratejiden miras alır :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
removeişlemi ana varlıktan alt varlıklarına yaymanıza olanak tanır .
Dolayısıyla, ana Postvarlığı commentskoleksiyonuyla birlikte getirirsek ve postvarlığı kaldırırsak :
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);
Hazırda bekletme üç silme ifadesini yürütecek:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
Alt PostCommentvarlıklar, alt varlıkları da CascadeType.REMOVEkaldırmışız gibi davranan strateji nedeniyle silindi .
Yetim kaldırma stratejisi
orphanRemovalÖznitelik aracılığıyla ayarlanması gereken yetim kaldırma stratejisi :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
koleksiyondan alt varlığı kaldırdıktan sonra alt tablo satırını kaldırmanıza izin verir.
Demek ki yüklerseniz Postonun yanında varlık commentstoplama ve birinci kaldırmak PostCommentgelen commentskoleksiyonunda:
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, ilişkili post_commenttablo satırı için bir DELETE deyimi yürütecek :
DELETE FROM post_comment
WHERE id = 2
Bu konu hakkında daha fazla ayrıntı için bu makaleye de göz atın.