JPA CascadeType.ALL अनाथ बच्चों को नहीं हटाता है


132

मुझे निम्नलिखित मैपिंग के साथ जेपीए का उपयोग करके अनाथ नोड्स को हटाने में परेशानी हो रही है

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;

मैं अनाथ भूमिकाओं के मुद्दे को डेटाबेस के चारों ओर लटका रहा हूं।

मैं एनोटेशन org.hibernate.annotations.Cascadeहाइबरनेट विशिष्ट टैग का उपयोग कर सकता हूं लेकिन जाहिर है कि मैं अपने समाधान को हाइबरनेट कार्यान्वयन में बाँधना नहीं चाहता।

EDIT : ऐसा लगता है कि JPA 2.0 में इसके लिए समर्थन शामिल होगा।

जवाबों:


164

यदि आप इसे हाइबरनेट के साथ उपयोग कर रहे हैं, तो आपको एनोटेशन को स्पष्ट रूप से परिभाषित करना होगा CascadeType.DELETE_ORPHAN, जिसका उपयोग जेपीए के साथ किया जा सकता है CascadeType.ALL

यदि आप हाइबरनेट का उपयोग करने की योजना नहीं बनाते हैं, तो आपको पहले बच्चे के तत्वों को स्पष्ट रूप से हटाना होगा और फिर किसी भी अनाथ रिकॉर्ड से बचने के लिए मुख्य रिकॉर्ड को हटाना होगा।

निष्पादन अनुक्रम

  1. हटाए जाने के लिए मुख्य पंक्ति प्राप्त करें
  2. बाल तत्वों को लाना
  3. सभी बाल तत्वों को हटा दें
  4. मुख्य पंक्ति हटाएं
  5. सत्र बंद करें

JPA 2.0 के साथ, अब आप orphanRemoval = true विकल्प का उपयोग कर सकते हैं

@OneToMany(mappedBy="foo", orphanRemoval=true)

3
धन्यवाद मैंने इस मार्ग को समाप्त कर दिया, मुझे लगता है कि यह जेपीए की कल्पना के लिए एक छोटा है।
पॉल व्हेलन

13
JPA 2.0 मानक में अब हटा दिया गया है एक विशेषता के रूप में @OneToMany यदि आप नवीनतम हाइबरनेट का उपयोग कर रहे हैं तो आप @OneToMany कर सकते हैं (..., DeleteOrphan = true)
joohke

जब मैं सिर्फ बाल-तत्वों को अद्यतन करता हूं तो निष्पादन अनुक्रम क्या होता है? क्या अनाथ-अभिलेख हटाए जाएंगे?
jAckOdE

113

यदि आप JPA 2.0 का उपयोग कर रहे हैं, तो आप अब अनाथों को हटाने orphanRemoval=trueके लिए @xxxToManyएनोटेशन की विशेषता का उपयोग कर सकते हैं ।

दरअसल, CascadeType.DELETE_ORPHAN3.5.2-फाइनल में पदावनत किया गया है।


6
वास्तव में मुझे लगता है कि orphanRemoval = सही का अर्थ कुछ और है, अर्थात, जब मैं इसे माता-पिता के संग्रह से हटाता हूं, तो किसी ऑब्जेक्ट को हटा दें। देखें डाउनलोड
Archie

कृपया आर्ची के लिंक के माध्यम से जी।
जिगर शाह

4
orphanRemoval = true काम नहीं करता है। इसे पुराने तरीके से करना होगा।
जो अल्मोर

45
╔═════════════╦═════════════════════╦═════════════════════╗
   Action      orphanRemoval=true    CascadeType.ALL   
╠═════════════╬═════════════════════╬═════════════════════╣
   delete         deletes parent      deletes parent   
   parent         and orphans         and orphans      
╠═════════════╬═════════════════════╬═════════════════════╣
   change                                              
  children      deletes orphans         nothing        
    list                                               
╚═════════════╩═════════════════════╩═════════════════════╝

1
यदि मेरे पास cascade = CascadeType.ALL, orphanRemoval = falseमाता-पिता हैं तो क्या होगा ? क्या यह बच्चों को हटा देगा, भले ही मैंने विशेष रूप से नहीं बताया है?
izogfif

12

यदि आप EPA का उपयोग EclipseLink के साथ कर रहे हैं, तो आपको @PStreetOwned एनोटेशन सेट करना होगा

दस्तावेज़ीकरण: ग्रहण विकी - एक्लिप्सिंक जेपीए एक्सटेंशन का उपयोग करना - अध्याय १.४ @ का उपयोग कैसे करें


7

आप अनाथों को हटाने के लिए @PirtOwned का उपयोग कर सकते हैं

@OneToMany(mappedBy = "masterData", cascade = {
        CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;

5
थैंक्स @reshma यह ध्यान दिया जाना चाहिए @PirtOwned एक eclipselink JPA एक्सटेंशन है।
पॉल व्हेलन

5

मुझे बस यह समाधान मिल रहा है लेकिन मेरे मामले में यह काम नहीं करता है:

@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 

orphanRemoval = सत्य का कोई प्रभाव नहीं है।


1
परिवर्तन के प्रभावी होने से पहले मुझे सफाई और निर्माण करने की आवश्यकता थी।
मर्ल्बजो

वाह, मैं एक घंटे के लिए देख रहा हूँ क्यों CascadeType.ALL को जोड़ने पर मेरे ManyToOne को हटाए जाने के बारे में जानकारी नहीं थी। साफ और निर्मित और यह काम करता है। साभार @maralbjo
एंड्रयू मयूर


2

मुझे भी यही समस्या थी और मुझे आश्चर्य हुआ कि नीचे की इस शर्त ने अनाथों को क्यों नहीं हटाया। हाइबरनेट (5.0.3.Final) में व्यंजनों की सूची को हटाया नहीं गया था, जब मैंने एक नाम हटाए गए क्वेरी को निष्पादित किया था:

@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();

तब मुझे याद आया कि मुझे नामांकित क्वेरी का उपयोग नहीं करना चाहिए , लेकिन EntityManager। जैसा कि मैंने EntityManager.find(...)इकाई को लाने और फिर EntityManager.remove(...)इसे हटाने के लिए विधि का उपयोग किया , वैसे ही व्यंजन भी हटा दिए गए।


2

बस @OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)

TargetEntity = MyClass.class निकालें , यह बहुत अच्छा काम करता है।



0

मैं एक से एक मैपिंग का उपयोग कर रहा था, लेकिन बच्चा नष्ट नहीं हो रहा था जेपीए विदेशी कुंजी उल्लंघन दे रहा था

OrphanRemoval = true का उपयोग करने के बाद, समस्या हल हो गई


@OneToOne (cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn (नाम = "CHILD_OID") प्राइवेट चाइल्ड चाइल्ड;
विपिन चौहान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.