चूँकि यह प्रश्न बहुत ही सामान्य है, यह उत्तर इस लेख पर आधारित है जो मैंने अपने ब्लॉग पर लिखा था।
CascadeType.REMOVE
CascadeType.REMOVEरणनीति है, जो आपको स्पष्ट रूप से कॉन्फ़िगर कर सकते हैं:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.REMOVE
)
private List<PostComment> comments = new ArrayList<>();
या यह CascadeType.ALLरणनीति से निहित है :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL
)
private List<PostComment> comments = new ArrayList<>();
आपको removeमूल संस्था से इसकी बाल संस्थाओं तक के संचालन का प्रचार करने की अनुमति देता है।
इसलिए, यदि हम Postइसके commentsसंग्रह के साथ मूल इकाई को प्राप्त करते हैं , और postइकाई को हटा देते हैं :
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);
हाइबरनेट तीन डिलीट स्टेटमेंट को निष्पादित करने वाला है:
DELETE FROM post_comment
WHERE id = 2
DELETE FROM post_comment
WHERE id = 3
DELETE FROM post
WHERE id = 1
PostCommentबच्चे संस्थाओं की वजह से नष्ट कर दिया गया CascadeType.REMOVEरणनीति है, जो के रूप में अगर हम बच्चे संस्थाओं के रूप में अच्छी तरह से हटा दिया काम किया।
अनाथ-हटाने की रणनीति
अनाथ-निष्कासन रणनीति, जिसे orphanRemovalविशेषता के माध्यम से सेट करने की आवश्यकता है :
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PostComment> comments = new ArrayList<>();
आपको संग्रह से बाल इकाई को हटाने पर चाइल्ड टेबल रो को हटाने की अनुमति देता है।
इसलिए, यदि हम Postइकाई को उसके commentsसंग्रह के साथ लोड करते हैं और संग्रह PostCommentसे पहली हटाते हैं comments:
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));
हाइबरनेट संबंधित post_commentतालिका पंक्ति के लिए DELETE विवरण निष्पादित करने जा रहा है :
DELETE FROM post_comment
WHERE id = 2
इस विषय के बारे में अधिक जानकारी के लिए, इस लेख को भी देखें।