चूंकि यह एक बहुत ही सामान्य प्रश्न है, इसलिए मैंने यह लेख लिखा है , जिस पर यह उत्तर आधारित है।
इकाई अवस्था परिवर्तन
JPA, INSERT, UPDATE या DELETE जैसे SQL स्टेटमेंट में इकाई स्टेट ट्रांज़िशन का अनुवाद करता है।

जब आप persistएक इकाई होते हैं EntityManager, तो आप फ्लश होने पर निष्पादित किए जाने वाले INSERT स्टेटमेंट को शेड्यूल कर रहे हैं , या तो स्वचालित रूप से या मैन्युअल रूप से।
जब आप removeएक इकाई होते हैं, तो आप DELETE स्टेटमेंट को शेड्यूल कर रहे होते हैं, जिसे पर्सिस्टेंस कॉन्टेक्स्ट के फ्लश होने पर निष्पादित किया जाएगा।
कैस्केडिंग इकाई राज्य परिवर्तन
सुविधा के लिए, जेपीए आपको अभिभावक संस्थाओं से बच्चे के लिए इकाई के राज्य संक्रमण का प्रचार करने की अनुमति देता है।
इसलिए, यदि आपके पास एक अभिभावक Postसंस्था है , जिसका बाल संस्था से @OneToManyजुड़ाव हैPostComment :

commentsमें संग्रह Postइकाई के रूप में निम्नानुसार मैप किया गया है:
@OneToMany(
mappedBy = "post",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Comment> comments = new ArrayList<>();
CascadeType.ALL
cascadeविशेषता जेपीए प्रदाता बताता है माता पिता से इकाई राज्य संक्रमण पारित करने के लिए Postसभी के लिए इकाई PostCommentमें निहित संस्थाओंcomments संग्रह।
इसलिए, यदि आप Postइकाई को हटाते हैं :
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
entityManager.remove(post);
JPA प्रदाता PostCommentपहले इकाई को निकालने जा रहा है , और जब सभी बाल निकाय हटा दिए जाते हैं, तो यह Postइकाई को भी हटा देगा :
DELETE FROM post_comment WHERE id = 1
DELETE FROM post_comment WHERE id = 2
DELETE FROM post WHERE id = 1
अनाथ निकालना
जब आप orphanRemovalविशेषता सेट करते हैं true, तो JPA प्रदाता एक शेड्यूल करने वाला हैremove ऑपरेशन जब चाइल्ड एंटिटी को संग्रह से हटा दिया जाता है।
तो, हमारे मामले में,
Post post = entityManager.find(Post.class, 1L);
assertEquals(2, post.getComments().size());
PostComment postComment = post.getComments().get(0);
assertEquals(1L, postComment.getId());
post.getComments().remove(postComment);
JPA प्रदाता संबंधित post_commentरिकॉर्ड को हटाने जा रहा है क्योंकि PostCommentइकाई अब commentsसंग्रह में संदर्भित नहीं है :
DELETE FROM post_comment WHERE id = 1
DELETE CASCADE पर
ON DELETE CASCADEFK स्तर पर परिभाषित किया गया है:
ALTER TABLE post_comment
ADD CONSTRAINT fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
ON DELETE CASCADE;
एक बार जब आप ऐसा करते हैं, यदि आप एक postपंक्ति हटाते हैं :
DELETE FROM post WHERE id = 1
सभी संबंधित post_commentनिकाय डेटाबेस इंजन द्वारा स्वचालित रूप से हटा दिए जाते हैं। हालांकि, यह एक बहुत ही खतरनाक ऑपरेशन हो सकता है यदि आप गलती से किसी रूट इकाई को हटाते हैं।
निष्कर्ष
जेपीए cascadeऔर orphanRemovalविकल्पों का लाभ यह है कि आप खोए हुए अपडेट को रोकने के लिए आशावादी लॉकिंग से भी लाभ उठा सकते हैं ।
यदि आप JPA कैस्केडिंग तंत्र का उपयोग करते हैं, तो आपको DDL- स्तर का उपयोग करने की आवश्यकता नहीं है ON DELETE CASCADE , जो कि एक मूल इकाई को हटाने पर बहुत खतरनाक ऑपरेशन हो सकता है जिसमें कई स्तरों पर कई बाल संस्थाएँ हैं।
इस विषय के बारे में अधिक जानकारी के लिए, इस लेख को देखें ।