2011-04-26 17 views
12

से निपटने के दौरान गायब पंक्तियों पर हाइबरनेट चुटकुले मैं एक विरासत डेटाबेस (जो अभी भी एक विरासत PHP क्लाइंट है) पर हाइबरनेट को कार्यान्वित करने की कोशिश कर रहा हूं, और कुछ समस्याओं में चल रहा हूं क्योंकि मूल ऐप लिखने वाले लोगों के पास कोई नहीं था विचार करें कि वे क्या कर रहे थे।विरासत डेटाबेस

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

यह त्रुटि मैं हाइबरनेट से मिलता है:

Caused by: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tv.platform.domain.Program#0] 

क्या मैं चाहूँगा इस गंदगी, जहां क्षेत्र होगा सिर्फ अशक्त यदि पंक्ति अमान्य है या मौजूद नहीं है से निपटने के लिए एक सुंदर तरीका है , लेकिन मुझे कोई भाग्य नहीं है कि यह डॉक्यूमेनेशन में इसे कैसे संभाला जाए।

कोई सुझाव?

उत्तर

14

एनोटेशन: @NotFound (कार्रवाई = NotFoundAction.IGNORE)

वास्तव में क्या मैं खोज रहा था करता है। मैं यहाँ के द्वारा प्राप्त हुआ:

Hibernate Many-To-One Foreign Key Default 0

+1

जो मैं ढूंढ रहा था उसके लिए शुरुआती बिंदु। हाइबरनेट मैपिंग फ़ाइलों के लिए, विशेषता 'नहीं मिली 1' (उदा: '<कई से एक ... नहीं मिला =" अनदेखा करें "/>') – jdknight

2

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

आप MyBatis SQLMaps, जिसमें आप अपने कार्यक्रम के लिए फ़ाइलों में अपने डेटा को बाहरी लोड करने के लिए SQL कथन प्रदान की तरह एक रूपरेखा का अधिकाधिक लाभ उठाएं लाभ मिल सकता है, लेकिन ढांचे SELECT बयान एक साथ चेनिंग पूर्ण वस्तु रेखांकन लोड करने के लिए विकल्प प्रदान करता है। इस तरह आप 0 मानों को फ़िल्टर करने के लिए तर्क के साथ SQL कथन पूरक कर सकते हैं।

+0

सुझाव के लिए धन्यवाद, लेकिन मैं हाइबरनेट साथ अटक कर रहा हूँ। मुझे अभी तक _decent_ वर्कअराउंड मिला है, लेकिन यह अच्छा होगा अगर मैं उस विशेष अपवाद को फंस सकता हूं और केवल फ़ील्ड को खाली कर सकता हूं। – liam

1

मुझे लगता है कि interceptor चाल चल सकता है।

+0

मैंने ऑडिट लॉग बनाने के लिए इंटरसेप्टर्स की जांच की, और इनका उपयोग करने के कई उदाहरणों के बाहर, यह थोड़ा सा सामान्य प्रतीत होता था।मैंने जो कहीं भी सूचीबद्ध किया है, वह मैं कर रहा हूं जो मैं चाहता था। – liam

0

मैंने हाल ही में इसी तरह के मुद्दों के साथ एक विरासत डेटाबेस के खिलाफ एक वेबपैम प्रोग्राम किया है। यदि आप एकाधिक डेटा एक्सेस फ्रेमवर्क का उपयोग नहीं करना चाहते हैं, तो भी आप हाइबरनेट का उपयोग कर सकते हैं। मैंने जो किया है वह 'createSqlQuery' का उपयोग करके मुश्किल भागों के लिए मूल SQL क्वेरी लिखता है। कुछ मामलों में मुझे एक इकाई संपत्ति में पूर्ण सबक्विरी या गणना मूल्यों को मैप करना था, लेकिन यह काम करता है। डेटाबेस के उन हिस्सों के लिए जो अधिक नियमित थे, मैं अब भी नियमित हाइबरनेट मैपिंग और मानदंड/एचक्यूएल प्रश्नों का उपयोग कर सकता हूं।

एक और बात: शायद आपको 'कोई विचार नहीं कि वे क्या कर रहे थे' या 'मक' जैसे शब्दों का उपयोग करने से बचना चाहिए। मुझे पता है कि पूर्ववर्ती द्वारा आपको कम से कम किसी भी कोड को देखने के लिए मोहक है, लेकिन महसूस करें कि इन लोगों ने शायद उस समय सबसे अच्छा किया था। इसके अलावा, आपका स्वयं का कोड दोषपूर्ण नहीं है, इसलिए कुछ नम्रता जगह पर है। क्यूं कर? एक के लिए, आपके आस-पास के लोग आपके साथ थोड़ा बेहतर हो सकते हैं यदि आप पिछले डेवलपर (ओं) के बारे में हर समय मुंह के आसपास फूम नहीं कर रहे हैं, जिन्हें उन्होंने बहुत ही जानकार माना था। बस एक टिप।

+0

आपने कोडबेस नहीं देखा है। – liam

+0

आप कैसे सुनिश्चित कर सकते हैं कि मेरे पास नहीं है? शायद मैंने इसे लिखा था। –

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