मुझे पता है कि अनाथाश्रम बाल वस्तुओं को हटाना SO पर एक आम प्रश्न है और हाइबरनेट के लिए नए लोगों के लिए एक आम समस्या है, और यह कि मानक मानक उत्तर यह सुनिश्चित करना है कि आपके पास बाल संग्रह पर cascade=all,delete-orphan
या cascade=all-delete-orphan
की कुछ भिन्नता है।अलग वस्तु को अद्यतन करते समय अनाथ संग्रह को हटा सकते हैं?
मैं हाइबरनेट को यह पता लगाने में सक्षम होना चाहता हूं कि मूल संग्रह से बाल संग्रह खाली/हटा दिया गया है, और मूल ऑब्जेक्ट अपडेट होने पर डेटाबेस से हटाई गई बाल तालिका में पंक्तियां हैं। उदाहरण के लिए:
Parent parent = session.get(...);
parent.getChildren().clear();
session.update(parent);
Parent
वर्ग के लिए मेरे वर्तमान मानचित्रण की तरह दिखता है:
<bag name="children" cascade="all-delete-orphan">
<key column="parent_id" foreign-key="fk_parent_id"/>
<one-to-many class="Child"/>
</bag>
जब एक संलग्न वस्तु को अद्यतन करने के यह मेरे लिए ठीक काम करता है, लेकिन मैं एक का उपयोग मामला है जिसमें हम चाहते हैं एक पृथक ऑब्जेक्ट (जिसे HTTP/JSON पर रिमोट क्लाइंट द्वारा हमारे एपीआई विधि में भेजा गया है) ले जाने में सक्षम होने के लिए, और सीधे इसे हाइबरनेट सत्र में पास कर दें - ताकि ग्राहकों को मूल ऑब्जेक्ट में किसी भी तरह से हेरफेर करने में सक्षम बनाया जा सके। वे पसंद करते हैं और परिवर्तन जारी रहते हैं।
मेरी अलग वस्तु पर session.update(parent)
पर कॉल करते समय, बच्चे की तालिका में पंक्तियां अनाथ हैं (एफके कॉलम शून्य पर सेट है) लेकिन हटाई नहीं गई है। ध्यान दें कि जब मैं session.update()
पर कॉल कर रहा हूं, यह पहली बार है जब हाइबरनेट सत्र इस ऑब्जेक्ट इंस्टेंस को देख रहा है - मैं ऑब्जेक्ट को किसी अन्य तरीके से ऑब्जेक्ट के साथ फिर से अटैचमेंट या विलय नहीं कर रहा हूं। मैं उन ऑब्जेक्ट्स को पास करने के लिए क्लाइंट पर निर्भर हूं जिनकी पहचानकर्ता डेटाबेस में वास्तविक वस्तुओं से मेल खाते हैं।
String jsonString = request.getParameter(...);
Parent parent = deserialize(jsonString);
session.update(parent);
यह जब session.update(parent)
के लिए पारित हाइबरनेट अलग माता पिता वस्तुओं में अनाथ बच्चों के संग्रह का पता लगाने के लिए संभव है: उदाहरण के लिए, मेरी एपीआई सेवा विधि में तर्क कुछ इस तरह है? या क्या मैं किसी भी तरह से अलग वस्तु का गलत उपयोग कर रहा हूं?
मेरी आशा थी कि मैं एक अलग उदाहरण में परिवर्तनों को जारी रखने के लिए हाइबरनेट के साथ किसी भी तरह की जटिल बातचीत से बच सकता हूं। session.update(parent)
पर कॉल के बाद मेरी एपीआई विधि को पृथक ऑब्जेक्ट को और संशोधित करने की आवश्यकता नहीं है, यह विधि केवल दूरस्थ क्लाइंट अनुप्रयोगों द्वारा किए गए परिवर्तनों के लिए ज़िम्मेदार है।
तुम्हारा मतलब क्या देखते हैं, मौजूदा इकाई और उसके बाद 'मर्ज लोड () 'यह अलग प्रकरण के साथ मुझे एपीआई पास किया? –
@ mattb: आप संग्रह को मर्ज करने के लिए एक तर्क लिख सकते हैं, या यहां तक कि पिछले संग्रह को भी प्रतिस्थापित कर सकते हैं और नया सेट कर सकते हैं, लेकिन यह सुनिश्चित कर लें कि आपने अपने एचबीएम में टैग जोड़ा है। यह में एक नया सहेजने से पहले पूर्ण संग्रह को हटाने के लिए एक सरल एसक्यूएल डिलीट क्वेरी होगी। या अन्य तरीकों से, आप कुछ भी जोड़ देंगे, इस एसक्यूएल डिलीट को हर बार निकाल दिया जाएगा और फिर आपके संग्रह की ताजा प्रति जोड़ा जाएगा। यह मैन्युअल रूप से संग्रह को अद्यतन करने की हर समस्या की आपकी समस्या का समाधान कर सकता है। –
मुझे यकीन नहीं है कि मुझे यह समाधान पसंद है, क्योंकि इसे मेरे उपयोग पैटर्न को बदलने की आवश्यकता होगी - उदाहरण के लिए ' 'जोड़ना। उम्मीद थी कि यह अकेले मैपिंग के साथ तय किया जा सकता है। –