सीधे documentation से। यह आपकी समस्या वास्तव में बताते हैं मुझे विश्वास:
हालांकि, इस कोड
Parent p = (Parent) session.Load(typeof(Parent), pid);
// Get one child out of the set
IEnumerator childEnumerator = p.Children.GetEnumerator();
childEnumerator.MoveNext();
Child c = (Child) childEnumerator.Current;
p.Children.Remove(c);
c.Parent = null;
session.Flush();
डेटाबेस से सी को नहीं निकाला जाएगा; यह केवल पी के लिंक को हटा देगा (और इस मामले में न तो पूर्ण बाधा उल्लंघन का कारण बनता है)। आपको बच्चे को स्पष्ट रूप से हटाएं() को साफ़ करने की आवश्यकता है।
Parent p = (Parent) session.Load(typeof(Parent), pid);
// Get one child out of the set
IEnumerator childEnumerator = p.Children.GetEnumerator();
childEnumerator.MoveNext();
Child c = (Child) childEnumerator.Current;
p.Children.Remove(c);
session.Delete(c);
session.Flush();
अब, हमारे मामले में, कोई बच्चा अपने माता-पिता के बिना वास्तव में अस्तित्व में नहीं हो सकता है। इसलिए यदि हम संग्रह से बच्चे को हटा देते हैं, तो हम वास्तव में इसे हटाना चाहते हैं। इसके लिए, हमें cascade = "all-delete-orphan" का उपयोग करना होगा।
<set name="Children" inverse="true" cascade="all-delete-orphan">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
संपादित करें:
साथ उलटा सामान के संबंध में, मैं विश्वास है कि यह केवल निर्धारित करता है कि एसक्यूएल उत्पन्न होता है, अधिक जानकारी के लिए इस doc देखते हैं।
एक बात नोट करने के लिए है, तो आप अपने हाइबरनेट config में कई-से-एक रिश्ते पर
not-null="true"
मिला है?
आपको शायद अपने मैपिंग के प्रासंगिक हिस्सों को दिखाना चाहिए। मैं गैर-विदेशी विदेशी कुंजी के साथ हर समय सभी डिलीट-अनाथ का उपयोग करता हूं और कभी भी कोई समस्या नहीं होती है। –