2012-10-23 14 views
132

मुझे लगता है कि मुझे @ManyToOne रिश्ते के संदर्भ में कैस्केडिंग के अर्थ को समझने में याद आती है।जेपीए @ मैनी टोनऑन कैस्केड टाइप के साथ

मामला:

public class User { 

    @OneToMany(fetch = FetchType.EAGER) 
    protected Set<Address> userAddresses; 

} 

public class Address { 

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    protected User addressOwner; 

} 

cascade = CascadeType.ALL का अर्थ क्या है? उदाहरण के लिए, यदि मैं डेटाबेस से एक निश्चित पता हटा देता हूं, तो मैंने यह तथ्य कैसे देखा कि cascade = CascadeType.ALL मेरे डेटा को प्रभावित करता है (उपयोगकर्ता मुझे लगता है)? ओपनजेपीए दस्तावेज़ों के उदाहरण के लिए

उत्तर

230

CascadeType.ALL का अर्थ यह है कि दृढ़ता संबंधित इकाइयों को सभी EntityManager संचालन (PERSIST, REMOVE, REFRESH, MERGE, DETACH) प्रचार (कैस्केड) प्रसारित करेगी।

यह आपके मामले में एक बुरा विचार है, क्योंकि Address को हटाने से संबंधित User को हटा दिया जाएगा। चूंकि उपयोगकर्ता के पास कई पते हो सकते हैं, अन्य पते अनाथ बन जाएंगे। हालांकि उलटा मामला (User को एनोटेट करना) समझ में आता है - यदि कोई पता केवल एक उपयोगकर्ता से संबंधित है, तो यह उपयोगकर्ता हटा दिए जाने पर उपयोगकर्ता से संबंधित सभी पते को हटाने का प्रचार करना सुरक्षित है।

बीटीडब्लू: आप विशेषता को अपने User में जोड़ना चाहते हैं ताकि दृढ़ता प्रदाता को संकेत दिया जा सके कि कॉलम ADDRESS तालिका में होना चाहिए।

+27

+1 मैं कभी भी पार हो गया हूं। – Ridcully

+3

हालांकि @OneToMany पक्ष पर CascadeType.ALL होना अच्छा हो सकता है। – mvmn

33

See hereCascadeType.ALL का मतलब है कि यह सभी कार्यों को करेगा।

उद्धरण:

CascadeType.PERSIST: जब एक इकाई बने, यह भी इस क्षेत्र में आयोजित संस्थाओं जारी रहती है। हम इस कैस्केड नियम के उदार आवेदन का सुझाव देते हैं, क्योंकि यदि EntityManager को ऐसा क्षेत्र मिलता है जो फ़्लश के दौरान एक नई इकाई का संदर्भ देता है, और फ़ील्ड कैस्केड टाइप टाइप नहीं करता है, तो यह एक त्रुटि है।

कैस्केड टाइप .REMOVE: किसी इकाई को हटाने पर, इस क्षेत्र में आयोजित इकाइयों को भी हटा दें।

कैस्केड टाइप .REFRESH: किसी इकाई को रीफ्रेश करते समय, इस क्षेत्र में आयोजित इकाइयों को भी ताज़ा करें।

कैस्केड टाइप। मेर्ज: इकाई स्थिति विलय करते समय, इस क्षेत्र में आयोजित इकाइयों को मर्ज करें।

सेबस्टियन

+3

जेपीए में नया, यह जानकारी उपयोगी है लेकिन यहां अलग करने के बारे में क्या है? – Sarz

+1

कैस्केड टाइप टाइप में, एक इकाई को अलग करते समय, मैं मूल इकाई द्वारा आयोजित इकाइयों को भी अलग करता हूं। मैप किए गए सबसे अच्छे और सबसे कम स्पष्टीकरण के लिए –

15

From the EJB3.0 Specification:

झरना एनोटेशन तत्व की

उपयोग जुड़े संस्थाओं के लिए एक ऑपरेशन के प्रभाव का प्रचार करने के लिए इस्तेमाल किया जा सकता है। कैस्केड कार्यक्षमता आमतौर पर माता-पिता के संबंधों में उपयोग की जाती है।

यदि एक्स एक प्रबंधित इकाई है, तो निकालने का ऑपरेशन इसे हटा देता है। एक्स, द्वारा संदर्भित इकाइयों को हटा दिया गया है, यदि एक्स से इन अन्य इकाइयों के रिश्तों को कैस्केड = रिमूव या कैस्केड = सभी एनोटेशन तत्व मान के साथ एनोटेट किया गया है।

तो संक्षेप में, इकाई रिश्तों CascadeType.All के साथ परिभाषित यह सुनिश्चित करेंगे कि इस तरह के रूप में सभी हठ घटनाओं, जारी रहती है ताज़ा करते हैं, विलय और निकालने के माता-पिता पर पाए जाते हैं कि, बच्चे को दे दिया जाएगा। अन्य CascadeType विकल्पों को परिभाषित करने से एंटरप्राइज़ एसोसिएशन दृढ़ता से निपटने के तरीके पर अधिक ग्रेन्युलर स्तर के नियंत्रण के साथ डेवलपर प्रदान करता है।

उदाहरण के लिए यदि मेरे पास ऑब्जेक्ट बुक था जिसमें पृष्ठों की एक सूची थी और मैं इस सूची में एक पृष्ठ वस्तु जोड़ता हूं। यदि @OneToMany पुस्तक और पृष्ठ के बीच संबंध को परिभाषित करने वाला एनोटेशन CascadeType.All के रूप में चिह्नित किया गया है, तो पुस्तक को जारी रखने के परिणामस्वरूप पृष्ठ को डेटाबेस पर भी जारी रखा जाएगा।

8

जेपीए 2.0 में यदि आप किसी उपयोगकर्ता इकाई से हटाए गए पते को हटाना चाहते हैं तो आप orphanRemoval=true (CascadeType.REMOVE के बजाय) @OneToMany पर जोड़ सकते हैं।

orphanRemoval=true और CascadeType.REMOVE के बीच अधिक स्पष्टीकरण here है।

6

जैसा कि मैंने this article में और मेरी किताब में, High-Performance Java Persistence बताया गया है, आप @ManyToOne पर CascadeType.ALL का उपयोग कभी नहीं करना चाहिए entity state transitions के बाद से बाल वालों के लिए जनक संस्थाओं से प्रचार करना चाहिए।

@ManyToOne पक्ष हमेशा बाल संघ है क्योंकि इसे अंतर्निहित एफके को मानचित्र बनाना चाहिए।

इसलिए, @OneToMany करने के लिए @ManyToOne संघ के बाद से यह the most efficient one-to-many mapping है जो mappedBy विशेषता का उपयोग करना चाहिए से CascadeType.ALL चलते हैं। `

संबंधित मुद्दे