क्या गड़बड़ है... 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 ।