2015-07-08 13 views
6
  • मैं कोई स्पष्ट प्राथमिक कुंजी (संयुक्त या अन्यथा) के साथ एक SQL डेटाबेस में देखा गया
  • मैं जेपीए
  • के माध्यम से
उन तक पहुँच करना चाहते हैं का उपयोग कर एक प्राथमिक कुंजी के बिना एक डेटाबेस दृश्य मैप करने के लिए कैसे

मैंने पढ़ा है कि मुझे जेपीए में विचारों का इलाज करने में सक्षम होना चाहिए जैसे कि मैं तालिकाओं का इलाज करता हूं (@Table एनोटेशन इत्यादि का उपयोग करके)। हालांकि प्राथमिक कुंजी के बिना मुझे हर कॉलम से प्रभावी रूप से एक समग्र कुंजी बनाना पड़ता है (वास्तव में, यह हाइबरनेट के रिवर्स-इंजीनियरिंग उपकरण में डिफ़ॉल्ट रूप से ऐसा लगता है)।जब जेपीए

हालांकि अगर मैं ऐसा करता हूं तो अवांछनीय दुष्प्रभाव होते हैं। ईजी।

  • आप सभी कोड के बजाय प्राथमिक कुंजी के गुण विचारों की ओर इशारा करते लिखने के लिए होने:।

    myViewObject.getPrimaryKey() getFirstName()

  • नहीं "findBy उपयोग करने के लिए सक्षम किया जा रहा ... "वसंत रिपोजिटरी पर विधियां (चूंकि वह विशेषता दृश्य के" पहचानकर्ता "का हिस्सा है और वास्तव में इसके गुणों में से एक नहीं है)।

मेरा प्रश्न है: मैं इस तरह के विचारों को कैसे मैप कर सकता हूं क्योंकि मैं आसानी से जेपीए का उपयोग करके अपने गुणों तक पहुंच सकता हूं?

नोट: मुझे यह जानकर बहुत खुशी हुई कि मैं पूरी तरह से गलत दृष्टिकोण का उपयोग कर रहा हूं। ऐसा लगता है कि इस तरह की एक आम समस्या एक बेहतर समाधान होने के लिए बाध्य है।

+0

एक चाल जो मैं नियोजित करता हूं, यह देखने के लिए संभावित प्रश्नों का विश्लेषण करना है कि कितने रिकॉर्ड लौटने की संभावना है और यह देखने के लिए कि क्या कोई ऐसा क्षेत्र है जो उन सभी स्थितियों में सभी रिकॉर्ड के लिए अद्वितीय रहेगा। यदि आप ऐसा परिदृश्य पा सकते हैं, तो आप उस फ़ील्ड को प्राथमिक कुंजी के रूप में निर्दिष्ट कर सकते हैं, भले ही यह वास्तव में प्राथमिक कुंजी न हो क्योंकि ओआरएम केवल एक क्वेरी के परिणामों के बीच विशिष्टता की परवाह करता है। लेकिन ध्यान दें कि आप दूसरे स्तर के कैश का उपयोग करने में सक्षम नहीं होंगे। ऐसे मामलों में जहां यह चाल लागू नहीं है, मैं प्राथमिक कुंजी को शामिल करने के लिए दृश्य के लिए क्वेरी को संशोधित करता हूं। – manish

+0

'getFirstName()' जैसी प्रतिनिधि विधियों को लिखने से रोकने के लिए कुछ भी नहीं है जो इसे वापस लौटाता है .getPrimaryKey()। GetFirstName() '। फिर आपको केवल एक बार लंबे संस्करण को लिखना होगा। गलत दृष्टिकोण होने के नाते, हमारे पास हमारे आवेदन में 400 से अधिक संस्थाएं/सारणी हैं और हमारे पास एक एकल व्यू-एंटिटी नहीं है। मैंने एक बार एक बार उपयोग करने की कोशिश की क्योंकि मैंने सोचा था कि इससे मदद मिलेगी, लेकिन इससे समस्याएं उत्पन्न हुईं, इसलिए मैंने जेपीक्यूएल में एक ही 'व्यू' बनाया जिसने एक ही काम किया, और मुझे और अधिक लचीलापन दिया। – DuncanKinnear

उत्तर

5

आप दृश्यों की प्रत्येक पंक्ति में एक यूयूआईडी कॉलम जोड़ सकते हैं ताकि आप use the UUID column as an @Id कर सकें।

+0

हाँ, यह काम किया, धन्यवाद। मैंने एक अतिरिक्त कॉलम शामिल करने के लिए अपने (ओरेकल) विचारों को बदल दिया है: 'sys_guid() AS uuid' फिर मेरे विचार के शीर्ष पर निम्नलिखित संपत्ति जोड़ा गया @ एंटीटी: ' @Id @ कॉलम (नाम = " यूयूआईडी ") @ जेसन इग्नोर संरक्षित स्ट्रिंग uuidHex;' –

+2

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

+0

इसके विपरीत, यह वही है जो मुझे समस्या को हल करने के लिए आवश्यक था। मेरी समस्या यह थी कि कोई स्पष्ट प्राथमिक कुंजी नहीं थी (ऊपर देखें)। शुद्ध डेटा कॉलम का संग्रह कल्पना करें, जिनमें से कुछ या सभी शून्य हो सकते हैं (सामान्य रूप से SQL डेटाबेस में पर्याप्त)। मुझे आधिकारिक तौर पर हाइबरनेट खुश रखने के लिए उन्हें पीके देना था। क्वेरी में जेनरेट किए गए यूयूआईडी को जोड़ना इस मानदंड को संतुष्ट करता है। नेविगेशन पहले स्थान पर कभी भी विकल्प नहीं था। –