क्या गड़बड़ है... AUTO_INCREMENT
MySQL का हिडन सीक्वेंस है। मूल समस्या यह है कि MySQL
एक ही समय में पीके को सम्मिलित और वापस नहीं कर सकता है, लेकिन हाइबरनेट को इसकी आवश्यकता है जबकि INSERT
एक नई इकाई में।
जिन समस्याओं का आप सामना करते हैं:
- यदि हाइबरनेट एक नई इकाई को सहेजता है, तो वह आईडी को नए EntityBean पर तुरंत सेट करने का प्रयास करता है। इसलिए हाइबरनेट को यह पढ़ना चाहिए कि हाइबरनेट तालिका में नए टुपल को सहेजने से पहले डेटाबेस किस आईडी का उपयोग करेगा।
- यदि आपके पास डेटाबेस तक पहुंचने वाले एकाधिक सर्वर हैं, तो आप हाइबरनेट के सत्र-फ़ैक्टरी को अंतर्निहित अनुक्रम (ऑटो-इन्क्रीमेंट) का उपयोग करने का निर्णय लेने देंगे या हाइबरनेट को निर्णय लेने देंगे (
GenerationType.AUTO
/GenerationType.IDENTITY
) आरक्षित पीके की खुली सीमा कितनी बड़ी है (एक डीबी-वास्तुकार की नौकरी)। (हमारे पास एक डेटाबेस में लगभग 20 सर्वर हैं, इसलिए एक अच्छी उपयोग की गई तालिका पर हम +100 की पीके-दूरी का उपयोग करते हैं)। यदि केवल एक सर्वर के पास डेटाबेस तक पहुंच हैGenerationType.TABLE
सही होगा।
हाइबरनेट को max(*)+1
. का उपयोग करके अगली आईडी की गणना स्वयं करनी होगी लेकिन:
- क्या होगा यदि दो अनुरोध
max(*)+1
मांगते हैं उसी समय/उसी परिणाम के साथ? दाएं:insert
का अंतिम प्रयास असफल हो जायेगी।
तो आपके पास एक टेबल होना चाहिए LAST_IDS
डेटाबेस में जो अंतिम टेबल-पीके को स्टोर करता है। यदि आप एक जोड़ना चाहते हैं, तो आपको यह चरण अवश्य करने चाहिए:
- पढ़ने के लिए आशावादी लेन-देन शुरू करें।
- LAST_IDS से MAX(address_id) चुनें
- अधिकतम को जावा-वेरिएबल यानी $OldID में संग्रहित करें।
- $NewID =$OldID + 1. (+100 निराशावादी-ताला में)
- अपडेट LAST_IDS SET address_id=
$newID
जहां address_id=$oldID
? - पढ़ने के लिए आशावादी लेनदेन करें।
- यदि प्रतिबद्ध सफल रहा, तो
$newID
स्टोर करें करने के लिएsetID()
हाइबरनेटबीन में आप सहेजना पसंद करते हैं। - अंत में हाइबरनेट को इन्सर्ट को कॉल करने दें।
मुझे पता है कि यही एकमात्र तरीका है।
BTW:हाइबरनेट-इकाइयाँ केवल इनहेरिटेंस का उपयोग करेंगी यदि डेटाबेस PostgreSQL
जैसी तालिकाओं के बीच इनहेरिटेंस का समर्थन करता है या Oracle
।