2012-03-25 10 views
15

का उपयोग करके नकारात्मक आईडी मान उत्पन्न करता है मैं निम्नलिखित परिभाषा के साथ एक वर्ग है:हाइबरनेट जब एक दृश्य

@Id 
@SequenceGenerator(name = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", sequenceName = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", allocationSize = 500) 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ACE_WORKERS_QUEUE_STATS_ID") 
@Column(name = "ID") 
private long Id; 

जब हम Jboss पर दौड़ा 4.2.3 यह ठीक काम किया है और उत्पन्न उचित पहचान पत्र (1000 से शुरू)

अब हम jboss 7.1.1 में चले गए और यह नकारात्मक आईडी उत्पन्न करता है! (-498 से शुरू हो रहा है और ऊपर जा रहा है)

कोई विचार यह क्यों हो सकता है?

+1

क्या आपने जांच की है कि ओरेकल में वर्तमान अनुक्रम क्या है और हाइबरनेट आउटपुट का पता लगाएं, यदि आप उचित अनुक्रम क्वेरी का चयन करते हैं और यदि आप एसकप्लस में पेस्ट कॉपी करते हैं तो आपको सही/समान/अपेक्षित परिणाम मिलते हैं? – HRgiger

उत्तर

24

जेबॉस 6.1 से जेबॉस 7.1 में माइग्रेट करते समय मैं बस इस मुद्दे में भाग गया।

JBoss के अनुसार के रूप में 7.1 जेपीए प्रलेखन (https://docs.jboss.org/author/display/AS71/JPA+Reference+Guide#JPAReferenceGuide-Persistenceunitproperties),

JBoss 7.1 स्वचालित रूप से कई हाइबरनेट गुण निर्धारित करता है। सेट किए जा रहे गुणों में से एक hibernate.id.new_generator_mappings है जो नए आईडी जेनरेटर सक्रिय करता है जो विभिन्न एल्गोरिदम का उपयोग करते हैं और पीछे की ओर संगत नहीं हैं। इस संपत्ति को अपनी persistence.xml फ़ाइल में गलत पर सेट करना पुराने आईडी जेनरेटर व्यवहार को पुनर्स्थापित करेगा।

हाइबरनेट 4 दस्तावेज़ों में नए आईडी जनरेटर के बारे में जानकारी भी है: http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html_single/#mapping-declaration-id-generator

हाइबरनेट दस्तावेज स्पष्ट रूप से बताता है कि नए आईडी जेनरेटर डिफ़ॉल्ट रूप से सक्षम नहीं हैं, लेकिन जैसा ऊपर बताया गया है, जेबॉस 7.1 स्वचालित रूप से उन्हें सक्षम कर रहा है।

पूरी तरह से समस्या मैं @SequenceGenerator में 1 को allocationSize जोड़ा (जो मैं छोड़ते हुए किया गया था) का समाधान करने के लिए:

+0

उत्तर के लिए धन्यवाद, मैं इसे पहले से ही ढूंढने में कामयाब रहा हूं, इसे यहां अपडेट करना भूल गया :( – Tomer

+0

हाइबरनेट संस्करण 5.0 से शुरू हो रहा है, 'hibernate.id.new_generator_mappings' प्रॉपर्टी' true 'पर डिफ़ॉल्ट है। Http: //docs.jboss देखें .org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html # पहचानकर्ता-जनरेटर –

12

hibernate.id.new_generator_mappings मेरी persistence.xml में false करने के लिए सेटिंग सिर्फ मेरी समस्या का हल के पहले भाग गया था।

AllocationSize प्राथमिक कुंजी हाइबरनेट के लिए आरक्षित मूल्यों की एक सीमा है:

30

नए व्यवहार निम्नलिखित है। और दोहरी से seq.nextval का चयन केवल प्राथमिक कुंजी की इस श्रेणी का उपभोग करने वाले हाइबरनेट के बाद किया जाएगा।

तो तुम दोनों allocationSize (हाइबरनेट) पर एक ही मूल्य और अनुक्रम increment by (DB)

घोषित, जब स्पष्ट रूप से allocationSize=500 सेट करना होगा जैसे ओरेकल

create sequence SEQ_ACE_WORKERS_QUEUE_STATS_ID 
     MINVALUE 1 
     MAXVALUE 999999999999999999999999999 
     START WITH 1 
     INCREMENT BY 500 
     NOCACHE 
     NOCYCLE; 

अन्यथा पर, आप ऋणात्मक मानों या बाधा त्रुटियों क्योंकि प्राथमिक कुंजी टकराव के अपने डीबी से उठाया पर ध्यान देंगे।

जब ऐप सर्वर पुनरारंभ होता है, तो आपको आवंटित नवीनतम प्राथमिक कुंजी और पुनरारंभ पर चयनित 'नया' अनुक्रम संख्या के बीच 'कूद' दिखाई देगा।

अंतिम टिप्पणी: डिफ़ॉल्ट मान 50. तो अगर आप हाइबरनेट तरफ allocationSize निर्दिष्ट नहीं करते हैं, तो आप increment by 50 डीबी पक्ष पर घोषित करना चाहिए है।

+0

बहुत उपयोगी उत्तर, क्योंकि यह जानकारी स्पष्ट रूप से हाइबरनेट दस्तावेज़ों में नहीं है। –

संबंधित मुद्दे