जेपीए और हाइबरनेट का उपयोग करते समय आईडी पीढ़ी की रणनीति का चयन कैसे करें


102

मैं हाइबरनेट संदर्भ गाइड के आईडी जनरेशन सेक्शन से गुजर रहा था और "हाइबरनेट के साथ जावा दृढ़ता"

संयुक्त रूप से हाइबरनेट और जेपीए के साथ कुछ विकल्प उपलब्ध हैं।

मैं विशिष्ट आईडी पीढ़ी की रणनीति का चयन करने के तरीके के बारे में आगे के दस्तावेज की तलाश में था।

मैं भी टिपिंग पॉइंट्स की तलाश में हूँ।

उदाहरण के लिए, हाइलो रणनीति से विवाद को कम करने की उम्मीद है। मैं यह मान रहा हूं कि इस पसंद से जुड़ा एक व्यापार बंद होना चाहिए।

मैं ट्रेड ऑफ के बारे में शिक्षित होना चाहता हूं।

क्या कोई साहित्य उपलब्ध है?

जवाबों:


92

इस पर एपीआई डॉक बहुत स्पष्ट है।

सभी जनरेटर इंटरफ़ेस को लागू करते हैं। org.hibernate.id.IdentifierGenerator। यह एक बहुत ही सरल इंटरफ़ेस है। कुछ अनुप्रयोग अपने स्वयं के विशेष कार्यान्वयन प्रदान करने के लिए चुन सकते हैं, हालांकि, हाइबरनेट अंतर्निहित कार्यान्वयन की एक सीमा प्रदान करता है। अंतर्निहित जनरेटर के शॉर्टकट नाम इस प्रकार हैं:

वेतन वृद्धि

प्रकार की पहचान करने वालों को लंबे, छोटे या इंट के रूप में उत्पन्न करता है जो केवल तभी अद्वितीय होते हैं जब कोई अन्य प्रक्रिया एक ही तालिका में डेटा नहीं डाल रही हो। एक क्लस्टर में उपयोग न करें।

पहचान

DB2, MySQL, MS SQL Server, Sybase और HypersonicSQL में पहचान कॉलम का समर्थन करता है। लौटाया गया पहचानकर्ता प्रकार लंबा, छोटा या इंट का है।

अनुक्रम

DB2, PostgreSQL, Oracle, SAP DB, McKoi या इंटरबेस में एक जनरेटर में एक अनुक्रम का उपयोग करता है। लौटाया गया पहचानकर्ता प्रकार लंबा, छोटा या इंट का है

हिलो

उच्च मानों के स्रोत के रूप में तालिका (और डिफ़ॉल्ट रूप से क्रमशः hibernate_unique_key और next_hi द्वारा) दिए गए प्रकार, लंबे, छोटे या int के पहचानकर्ताओं को कुशलतापूर्वक उत्पन्न करने के लिए एक हाय / लो एल्गोरिथ्म का उपयोग करता है। हाय / लो एल्गोरिथ्म पहचानकर्ताओं को उत्पन्न करता है जो केवल एक विशेष डेटाबेस के लिए अद्वितीय हैं।

seqhilo

एक नामांकित डेटाबेस अनुक्रम को दिए गए प्रकार, लंबे, छोटे या int के पहचानकर्ताओं को कुशलतापूर्वक उत्पन्न करने के लिए एक हाय / लो एल्गोरिथ्म का उपयोग करता है।

UUID

एक नेटवर्क (आईपी पते का उपयोग किया जाता है) के भीतर अद्वितीय हैं स्ट्रिंग के पहचानकर्ताओं को उत्पन्न करने के लिए एक 128-बिट UUID एल्गोरिथ्म का उपयोग करता है। UUID लंबाई में 32 हेक्साडेसिमल अंकों की एक स्ट्रिंग के रूप में एन्कोडेड है।

GUID

MS SQL सर्वर और MySQL पर डेटाबेस-जनरेटेड GUID स्ट्रिंग का उपयोग करता है।

देशी

अंतर्निहित डेटाबेस की क्षमताओं के आधार पर पहचान, अनुक्रम या हाइलो का चयन करता है।

सौंपा

एप्लिकेशन को सहेजने से पहले ऑब्जेक्ट को एक पहचानकर्ता असाइन करने देता है () कहा जाता है। यदि कोई तत्व निर्दिष्ट नहीं है तो यह डिफ़ॉल्ट रणनीति है।

चुनते हैं

डेटाबेस की ट्रिगर द्वारा सौंपी गई प्राथमिक कुंजी, कुछ अद्वितीय कुंजी द्वारा पंक्ति का चयन करके और प्राथमिक कुंजी मान को पुनः प्राप्त करता है।

विदेशी

किसी अन्य संबद्ध ऑब्जेक्ट के पहचानकर्ता का उपयोग करता है। यह आमतौर पर एक प्राथमिक कुंजी एसोसिएशन के साथ संयोजन में उपयोग किया जाता है।

अनुक्रम पहचान

एक विशेष अनुक्रम पीढ़ी की रणनीति जो वास्तविक मूल्य पीढ़ी के लिए एक डेटाबेस अनुक्रम का उपयोग करती है, लेकिन इसे सम्मिलित विवरण निष्पादन के हिस्से के रूप में उत्पन्न पहचानकर्ता मान को वापस करने के लिए JDBC3 getGeneratedKeys के साथ जोड़ती है। यह रणनीति केवल JDK 1.4 के लिए लक्षित Oracle 10g ड्राइवरों पर समर्थित है। ओरेकल ड्राइवरों में बग के कारण इन सम्मिलित विवरणों पर टिप्पणियाँ अक्षम होती हैं।

यदि आप अधिक समवर्ती उपयोगकर्ताओं के साथ एक साधारण एप्लिकेशन बना रहे हैं, तो आप वेतन वृद्धि, पहचान, हाइलो आदि के लिए जा सकते हैं । ये कॉन्फ़िगर करने के लिए सरल हैं और डीबी के अंदर ज्यादा कोडिंग की आवश्यकता नहीं है।

आपको अपने डेटाबेस के आधार पर अनुक्रम या गाइड का चयन करना चाहिए । ये सुरक्षित और बेहतर हैं क्योंकिid पीढ़ी डेटाबेस के अंदर होगी।

अपडेट: हाल ही में हमारे पास एक समस्या आई थी, जिसमें एक प्रकार से प्राइमरी टाइप (int) था, जो इसके बजाय वॉरैपर टाइप (पूर्णांक) का उपयोग करके तय किया गया था।


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

जब सीक्वेंस या गाइड के रूप में कुछ सीधा होता है, तो डेवलपर को दूसरे रास्ते चुनने के लिए क्या आवश्यकता हो सकती है।

1
मैंने अपना उत्तर अपडेट कर दिया है। वास्तव में वेतन वृद्धि, पहचान, हाइलो आदि .. सरल हैं। लेकिन वे उद्यम अनुप्रयोगों के लिए अनुकूल नहीं हैं। सभी विकल्पों को रखना कोई समस्या नहीं है, लेकिन सुनिश्चित करें कि आप अपने लिए सबसे उपयुक्त एक का उपयोग करें!
मनुक्प

हाँ। अब तक मुझे उत्थान या स्वीकार करने का विशेषाधिकार नहीं था।

मैं अधिक जानकारी में गोताखोरी देख रहा हूं, अगर आपके पास समय है तो मुझे बताएं।

45

असल में, आपके पास दो प्रमुख विकल्प हैं:

  • आप स्वयं पहचानकर्ता उत्पन्न कर सकते हैं, जिस स्थिति में आप एक निर्धारित पहचानकर्ता का उपयोग कर सकते हैं ।
  • आप @GeneratedValueएनोटेशन का उपयोग कर सकते हैं और हाइबरनेट आपके लिए पहचानकर्ता को असाइन करेगा।

उत्पन्न पहचानकर्ताओं के लिए आपके पास दो विकल्प हैं:

संख्यात्मक पहचानकर्ताओं के लिए आपके पास तीन विकल्प हैं :

  • पहचान
  • SEQUENCE
  • टेबल

जब आप SEDENCE (जैसे MySQL) का उपयोग नहीं कर सकते, तो पहचान केवल एक अच्छा विकल्प है क्योंकि यह JDBC बैच अपडेट को निष्क्रिय कर देता है

SEQUENCE एक पसंदीदा विकल्प है, विशेष रूप से जब पूल या पूल-लो जैसे पहचानकर्ता अनुकूलक के साथ उपयोग किया जाता है ।

टेबल को किसी भी कीमत पर टाला जाना चाहिए क्योंकि यह पहचानकर्ता और पंक्ति-स्तरीय ताले को लाने के लिए एक अलग लेन-देन का उपयोग करता है जो खराब तरीके से स्कैन करता है।


20


कुछ समय पहले मैंने हाइबरनेट कुंजी जनरेटर के बारे में एक विस्तृत लेख लिखा था: http://blog.eyallupu.com/2011/01/hibernatejpa-identity-generators.html

सही जनरेटर चुनना एक जटिल काम है लेकिन यह कोशिश करना महत्वपूर्ण है और इसे जल्द से जल्द प्राप्त करें - एक देर से प्रवास एक बुरा सपना हो सकता है।

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


2

मुझे यह व्याख्यान बहुत मूल्यवान लग रहा है https://vimeo.com/190275665 , बिंदु 3 में यह इन जनरेटर को सारांशित करता है और जब आप प्रत्येक का उपयोग करते हैं तो कुछ प्रदर्शन विश्लेषण और दिशानिर्देश भी देते हैं।


6
वह वीडियो बहुत परिचित लगता है।
व्लाद मिहालसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.