चूंकि यह एक बहुत ही सामान्य प्रश्न है, इसलिए मैंने यह लेख लिखा है , जिस पर यह उत्तर आधारित है।
इकाई अवस्था परिवर्तन
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 CASCADE
FK स्तर पर परिभाषित किया गया है:
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
, जो कि एक मूल इकाई को हटाने पर बहुत खतरनाक ऑपरेशन हो सकता है जिसमें कई स्तरों पर कई बाल संस्थाएँ हैं।
इस विषय के बारे में अधिक जानकारी के लिए, इस लेख को देखें ।