Bu soru çok yaygın olduğu için bu cevap blogumda yazdığım bu makaleye dayanmaktadır .
CascadeType.REMOVE
CascadeType.REMOVE
Açıkça yapılandırabilirsiniz strateji,:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
veya dolaylı olarak CascadeType.ALL
stratejiden miras alır :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
remove
işlemi ana varlıktan alt varlıklarına yaymanıza olanak tanır .
Dolayısıyla, ana Post
varlığı comments
koleksiyonuyla birlikte getirirsek ve post
varlığı 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 PostComment
varlıklar, alt varlıkları da CascadeType.REMOVE
kaldı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 Post
onun yanında varlık comments
toplama ve birinci kaldırmak PostComment
gelen comments
koleksiyonunda:
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_comment
tablo 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.