@ManyToOne JPA एसोसिएशन के लिए CascadeType.ALL का अर्थ क्या है


210

मुझे लगता है कि मैंने एक @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प्रभावित करता हूं कि मैंने अपने डेटा को प्रभावित किया है ( User, मुझे लगता है)?

जवाबों:


360

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

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

BTW: आप दृढ़ता प्रदाता को संकेत देने के mappedBy="addressOwner"लिए अपने Userलिए एक विशेषता जोड़ना चाहते हैं कि जुड़ाव कॉलम ADDRESS तालिका में होना चाहिए।


55
MappedBy का सबसे अच्छा और सबसे छोटा विवरण के लिए +1 मैं कभी भी भर आया हूं।
Ridcully

4
हालांकि CasOadeType.ALL का @OneToMany साइड में होना अच्छा हो सकता है।
mvmn

48

OpenJPA डॉक्स से एक उदाहरण के लिए यहां देखेंCascadeType.ALLइसका मतलब है कि यह सभी कार्य करेगा।

उद्धरण:

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

CascadeType.REMOVE: जब एक इकाई को हटाते हैं, तो यह इस क्षेत्र में आयोजित संस्थाओं को भी हटा देता है।

CascadeType.REFRESH: जब एक इकाई को ताज़ा करते हैं, तो इस क्षेत्र में आयोजित संस्थाओं को भी ताज़ा करें।

CascadeType.MERGE: जब मर्जिंग इकाई राज्य, भी इस क्षेत्र में आयोजित संस्थाओं विलय।

सेबस्टियन


4
जेपीए में नया, यह जानकारी उपयोगी है, लेकिन यहां क्या है?
सरज

1
CascadeType.DETACH में, जब एक इकाई का पता लगाते हैं, तो उन्हें मूल इकाई द्वारा रखी गई संस्थाओं को अलग कर देते हैं।
डोरियन मेजर

29

जैसा कि मैंने में विस्तार से बताया इस लेख और मेरी किताब, में उच्च प्रदर्शन जावा हठ , आप उपयोग नहीं करना चाहिए CascadeType.ALLपर @ManyToOneके बाद से इकाई राज्य संक्रमण बाल हैं, चारों ओर नहीं अन्य तरीके से करने के लिए माता पिता संस्थाओं से प्रचार करना चाहिए।

@ManyToOneपक्ष हमेशा बाल संघ के बाद से यह नक्शे अंतर्निहित विदेशी कुंजी स्तंभ है।

इसलिए, आप आगे बढ़ना चाहिए CascadeType.ALLसे @ManyToOneकरने के लिए संघ @OneToManyकी ओर है, जो भी इस्तेमाल करना चाहिए mappedBy, क्योंकि यह है विशेषता सबसे कुशल एक-से-कई तालिका संबंध मानचित्रण


18

EJB3.0 विशिष्टता से :

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

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

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

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


11

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

के बीच अधिक विवरण orphanRemoval=trueऔर CascadeType.REMOVEहै यहाँ


4

यदि आप उपयोगकर्ता को दिए गए पते को हटाना चाहते हैं और उपयोगकर्ता इकाई वर्ग को प्रभावित नहीं करना चाहते हैं, तो आपको कुछ इस तरह का प्रयास करना चाहिए:

@Entity
public class User {
   @OneToMany(mappedBy = "addressOwner", cascade = CascadeType.ALL)
   protected Set<Address> userAddresses = new HashSet<>();
}

@Entity 
public class Addresses {
   @ManyToOne(cascade = CascadeType.REFRESH) @JoinColumn(name = "user_id")
   protected User addressOwner;
}

इस तरह आपको एनोटेशन में लाने के बारे में चिंता करने की आवश्यकता नहीं है। लेकिन याद रखें कि उपयोगकर्ता को हटाते समय आप उपयोगकर्ता ऑब्जेक्ट से जुड़े पते को भी हटा देंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.