हम सभी का उपयोग करते समय हाइबरनेट के डिफ़ॉल्ट व्यवहार को जानते हैं @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
सेटिंग वास्तव में महत्वपूर्ण है। मुझे आशा है कि यह डिफ़ॉल्ट सेटिंग है कि मुझे इतना समय अनुसंधान खर्च करने की आवश्यकता नहीं है कि आईडी संख्या जंगली क्यों जाती है।