हम सभी का उपयोग करते समय हाइबरनेट के डिफ़ॉल्ट व्यवहार को जानते हैं @SequenceGenerator- यह एक के बाद एक वास्तविक डेटाबेस अनुक्रम को बढ़ाता है , इस मान को 50 (डिफ़ॉल्ट allocationSizeमान) से कई गुणा बढ़ाता है और फिर इस मान को इकाई आईडी के रूप में उपयोग करता है।
यह गलत व्यवहार और विनिर्देश के साथ संघर्ष है जो कहता है:
आबंटित करें - (वैकल्पिक) अनुक्रम से अनुक्रम संख्या आवंटित करते समय वेतन वृद्धि की राशि।
स्पष्ट होने के लिए: मैं उत्पन्न आईडी के बीच अंतराल के बारे में परेशान नहीं करता हूं।
मुझे उन आईडी की परवाह है जो अंतर्निहित डेटाबेस अनुक्रम के अनुरूप नहीं हैं । उदाहरण के लिए: कोई भी अन्य एप्लिकेशन (जैसे कि सादा JDBC का उपयोग करता है) अनुक्रम से प्राप्त आईडी के तहत नई पंक्तियाँ सम्मिलित करना चाह सकता है - लेकिन वे सभी मान पहले से ही हाइबरनेट द्वारा उपयोग किए जा सकते हैं! पागलपन।
क्या किसी को इस समस्या का कोई हल पता है (बिना सेटिंग allocationSize=1और इस तरह प्रदर्शन में गिरावट)?
EDIT:
चीजों को स्पष्ट करने के लिए। यदि अंतिम सम्मिलित रिकॉर्ड में ID = था 1, तो HB 51, 52, 53...अपनी नई संस्थाओं BUT के लिए एक ही समय में मानों का उपयोग करता है: डेटाबेस में अनुक्रम का मान सेट किया जाएगा 2। जब अन्य अनुप्रयोग उस अनुक्रम का उपयोग कर रहे हैं, तो आसानी से त्रुटियां हो सकती हैं।
Othe हाथ पर: विनिर्देश कहता है (मेरी समझ में) कि डेटाबेस अनुक्रम को सेट किया जाना चाहिए था 51और इस बीच HB को रेंज से मानों का उपयोग करना चाहिए 2, 3 ... 50
अद्यतन:
जैसा कि स्टीव आइबर्सोल ने नीचे उल्लेख किया है: मेरे द्वारा वर्णित व्यवहार (और कई के लिए सबसे सहज भी) सेटिंग द्वारा सक्षम किया जा सकता है hibernate.id.new_generator_mappings=true।
आप सभी का धन्यवाद।
अद्यतन 2:
भविष्य के पाठकों के लिए, नीचे आप एक कार्यकारी उदाहरण पा सकते हैं।
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
@SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
private Long id;
}
persistence.xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
saveअनुक्रम के अगले मूल्य के लिए डेटाबेस को क्वेरी करने की आवश्यकता है।
SequenceGeneratorहाइबरनेट के साथ डेटाबेस को केवल तभी क्वेरी करेगा जब आईडी की राशि allocationsizeरन आउट द्वारा निर्दिष्ट की गई हो। यदि आप सेट करते हैं allocationSize = 1तो यही कारण है कि हाइबरनेट प्रत्येक डीबी के लिए डीबी को क्वेरी करता है। इस मान को बदलें, और आप कर रहे हैं।
hibernate.id.new_generator_mappingsसेटिंग वास्तव में महत्वपूर्ण है। मुझे आशा है कि यह डिफ़ॉल्ट सेटिंग है कि मुझे इतना समय अनुसंधान खर्च करने की आवश्यकता नहीं है कि आईडी संख्या जंगली क्यों जाती है।