2013-08-21 11 views
9

मुझे उपरोक्त त्रुटि मिल रही है "org.hibernate.ObjectDeletedException: हटाए गए ऑब्जेक्ट को कैस्केड द्वारा हटाया जाएगा (निकालें संगठनों से हटाई गई वस्तु): "। क्या कोई मेरी मदद कर सकता है कि समस्या क्या हो सकती है और क्या तय किया जाना चाहिए?org.hibernate.ObjectDeletedException: हटाए गए ऑब्जेक्ट को कैस्केड द्वारा हटाया जाएगा (हटाए गए ऑब्जेक्ट को एसोसिएशन से हटाएं):

धन्यवाद।

उत्तर

14

अंत कोड मैपिंग के बिना थोड़ा मुश्किल है ... यह आमतौर पर होता है, क्योंकि आप ऑब्जेक्ट सहयोगी को किसी संग्रह में हटा रहे हैं।
आप वस्तु समूह (समूहों) के मालिक से वस्तु को निकालने के लिए और, जाने, हटाने

parentObject.collection.remove(objToDelete); 
session.delete(objToDelete); 
session.save(parentObject); 

है लेकिन आप इस deleteOrphan का उपयोग कर मैप किया संग्रह करने के लिए इस तरह से

class ParentObject { 
    @OneToMany(orphanRemoval=true) 
    private List<ChildObject> collection; 
} 

में से बच सकते हैं और कोड की तरह दिखता है

parentObject.collection.remove(objToDelete); 
session.save(parentObject); 

आप नहीं अधिक जरूरत वस्तु विलोपन क्योंकि यह स्वतः जब parentObject बचत हाइबरनेट द्वारा हटा दिया जाता है।

आशा मदद कर सकते हैं

+1

हाइबरनेट उपयोगकर्ताओं को अनाथ हटाने @ कैस्केड ({org.hibernate.annotations.CascadeType.DELETE_ORPHAN} के लिए इसका उपयोग करना चाहिए) – Akhilesh

5

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

समाधान सभी संदर्भों (संग्रह सहित) को ढूंढना है जिसके माध्यम से इकाई पहुंच योग्य है और उन्हें null पर सेट करें/संग्रह से इकाई को हटा दें।

आप अपने डिलीट तर्क को चारों ओर बदल सकते हैं: संदर्भ हटाएं (यदि केवल एक है) एक डिलीट अनाथ है और इसे हटाकर @bellabax के रूप में हटा दें।

2

यह अपवाद बताता है कि आप जिस ऑब्जेक्ट को हटा रहे हैं उसे किसी भी इकाई के संग्रह के साथ मैप किया गया है, और उस संग्रह आईडी में आपका कैस्केड भी है। तो अगर आप आप XML के माध्यम से यह कर रहे हैं (और नहीं एनोटेशन)

cascade = CascadeType.DETACH 
0

करने के लिए अपने झरना बदल सकते हैं अगर आप किसी भी तरह से हटाना चाहते हैं, नीचे एक समाधान जो मेरे लिए काम किया है:

एक-से -कई संघों:

  1. पैरेंट ऑब्जेक्ट [नोट में किसी भी संग्रह से बच्चे को वस्तु के किसी भी लिंक निकालें: तुम क्या कर रहे हैं, तो एक-से-एक संघ, बस पैरेंट ऑब्जेक्ट में बच्चे ऑब्जेक्ट संदर्भ सेट "शून्य"]
  2. डेटाबेस से बच्चे वस्तु हटाएं
  3. फ्लश session.flush()
  4. लिंक नए बच्चे वस्तु
  5. सहेजें पैरेंट ऑब्जेक्ट से 6 पैरेंट ऑब्जेक्ट) का उपयोग परिवर्तन पहले प्रतिबद्ध

सावधानी: सत्र।फ्लश() महत्वपूर्ण है क्योंकि हाइबरनेट को परिवर्तन देखने की आवश्यकता है,

यदि आप सत्र को फ्लश नहीं कर सकते हैं, तो मैं आपको एक अलग लेनदेन में कदम (1,2) करने की सलाह दूंगा और फिर चरणों (4,5, 6) एक नए लेनदेन में।

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