2010-11-26 16 views
21

मैं PostgreSQL अनुक्रम (एनोटेशन के माध्यम से) का उपयोग करने के रूप में निम्न प्रकार प्राथमिक कुंजी आईडी स्तंभ के लिए मान उत्पन्न करने के लिए हाइबरनेट कॉन्फ़िगर कर लिया है को प्रभावित नहीं करताPostgreSQL अनुक्रम के हाइबरनेट उपयोग अनुक्रम तालिका

database=# select last_value from entity_id_seq; 
last_value 
------------ 
    69 

(1 ro: इस विन्यास कि हाइबरनेट पहले से ही बने पर आईडी मूल्यों> 3000 बताए किया जाता है जबकि इस्तेमाल किया अनुक्रम पर क्वेरी निम्नलिखित से पता चलता है डब्ल्यू)

प्रश्न:
क्या कुछ गलत है या नहीं?
अनुक्रम तालिका के साथ सिंक हाइबरनेट करना चाहिए?
यदि नहीं, तो यह अंतिम जेनरेट की गई आईडी को कहां स्टोर करता है?

धन्यवाद।

उत्तर

25

मुझे एक ही समस्या थी। यह हाइबरनेट की रणनीति आवंटित आईडी से संबंधित है। Whe n आप जेनरेशन टाइप टाइप करें। SEQUENCE, हाइबरनेट HiLo रणनीति का उपयोग करता है जो डिफ़ॉल्ट रूप से 50 के ब्लॉक में आईडी आवंटित करता है। तो आप स्पष्ट रूप से इस तरह सेट कर सकते हैं allocationSize मूल्य:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq", allocationSize=1) 
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence") 
@Column(name="id", unique=true, nullable=false) 
public int getId() { 
    return this.id; 
} 

हालांकि, मैं भी सुना है कि राय allocationSize = 1 साथ हिलो रणनीति का प्रयोग एक अच्छा अभ्यास नहीं है। कुछ लोगों के बजाय GenerationType.AUTO उपयोग करने के लिए आप डेटाबेस से प्रबंधित दृश्यों

अद्यतन से निपटने के लिए जब अनुशंसा करते हैं: मैं allocationSize = 1 के साथ जा रहा खत्म किया था, और चीजों के रूप में मैं अब उम्मीद काम करने के लिए लग रहे हैं। मेरा आवेदन ऐसा है कि मुझे वास्तव में आईडी के ब्लॉक की आवश्यकता नहीं है, इसलिए YMMV

+0

धन्यवाद दिमाग भाई! मैंने बहुत शुरुआत के बाद से आवंटन आकार देखा लेकिन सोचा कि यह आविष्कारों की संख्या के बारे में है और माना जाता है कि अनुक्रम किसी भी मूल्य के साथ ठीक होना चाहिए। एक बार फिर धन्यवाद! – forker

+0

मुझे लगता है कि यह प्रदर्शन कारणों (डेटाबेस के लिए कम roundtrips) के लिए Hibernate द्वारा किया जाता है। यदि आप कम आवंटन आकार (धीमी अगली कड़ी() कॉल के साथ अनुक्रम पर विवाद का अनुभव करते हैं तो आप PostgreSQL –

20

पोस्टग्रेस अनुक्रमों के लिए जेनरेशन टाइप टाइप करें।

यह पूरी तरह से प्रतिद्वंद्वी है, लेकिन हाइबरनेट लोगों ने पूरी तरह से इस पर गड़बड़ कर ली है। आप जेनरेशन टाइप टाइप कर सकते हैं। या हाइबरनेट को अपने अनुक्रमों को ध्वस्त करना होगा यदि आपको अपने डीबी को पुनरारंभ/पुनर्निर्माण करना है। यह लगभग अपराधी रूप से लापरवाह है कि वे इस कोड को उत्पादन निर्माण में जाने की इजाजत देंगे, लेकिन हाइबरनेट टीम अपने बैल-हेड स्टैण्ड के लिए फ्लैट-गलत स्थिति की स्थिति के लिए प्रसिद्ध है (उदाहरण के लिए बाएं जॉइन पर अपनी स्थिति देखें)।

+3

गुड प्वाइंट, अनुक्रम में अनुक्रम के लिए कैश सेट करने पर विचार कर सकते हैं! लेकिन मुझे लगता है कि GenerationType.SEQUENCE का उपयोग करने का बहाना है: यदि आपके पास सीरियल पीके विरासत के साथ किसी अन्य व्यक्ति से विरासत में प्राप्त एक तालिका है, जिसके परिणामस्वरूप इसके लिए अनुक्रम साझा किया गया है, जेनरेशन टाइप। ऑटो सीरियल पीके के लिए सही मान असाइन करने में विफल रहेगा (यह होगा एक डुप्लिकेट मूल्य में चलाएं)। – forker

+4

मैं दृढ़ता से असहमत हूं। आपको बस इसके साथ जाने के लिए 'अनुक्रम जेनरेटर' निर्दिष्ट करना होगा, और (यदि आप गैर-हाइबरनेट अनुप्रयोगों के साथ अंतःक्रिया करना चाहते हैं) आवंटन आकार को 1 पर सेट करें। नए रिलीज़ में आप इसके बजाय 'hibernate.id.new_generator_mappings = true' को पुनर्स्थापित करने के लिए उपयोग कर सकते हैं विवेक; जब आप इसे लिखते हैं तो यह सच नहीं हो सकता है, लेकिन आवंटन आकार विकल्प निश्चित रूप से था। –

7

सबसे पहले, आपको यह निर्धारित करना होगा कि आप किस हाइबरनेट का उपयोग कर रहे हैं। हाइबरनेट-कोर संस्करणों के संदर्भ में, 3.2 बाद में विशेष रूप से एनोटेशन में परिभाषित के संबंध में आईडी जेनरेटर के लिए अधिक लगातार समर्थन प्रदान किया गया। चर्चा के लिए http://in.relation.to/Bloggers/New323HibernateIdentifierGenerators देखें।

अगला 3.6 एक सेटिंग ('hibernate.id.new_generator_mappings') जो कि डिफ़ॉल्ट रास्ता जेपीए-एनोटेशन नियंत्रित किया जाता है ब्लॉग जनरेटर है कि में चर्चा करता है की शुरुआत की। सेटिंग डिफ़ॉल्ट रूप से गलत है क्योंकि हाइबरनेट को पुराने संस्करणों के साथ पिछड़ा संगतता बनाए रखना है। यदि आप नया व्यवहार चाहते हैं (जिसे पूरी तरह से अनुशंसित किया जाता है) तो बस उस सेटिंग को सही पर सेट करें।

कैसे जेनरेशन टाइप को संभाला जाता है इस पर निर्भर करता है कि आप किस संस्करण का उपयोग कर रहे हैं और क्या आपके पास 'hibernate.id.new_generator_mappings' सत्य पर सेट है। मैं आप उपयोग कर रहे समझेंगे 3.6+ (के बाद से कुछ भी पुराने, ठीक है, पुरानी है) और (के बाद से है कि नए एप्लिकेशन के लिए सिफारिश है) सच करने के लिए 'hibernate.id.new_generator_mappings' सेट की क्या ज़रूरत है:

  1. GenerationType। ऑटो -> org.hibernate.id के नक्शे -> org.hibernate.id.enhanced.SequenceStyleGenerator कक्षा ब्लॉग
  2. GenerationType.TABLE में चर्चा करने के लिए नक्शे -> GenerationType.SEQUENCE
  3. GenerationType.SEQUENCE रूप में व्यवहार किया। enhanced.TableGenerator कक्षा ब्लॉग में चर्चा की
0

Postgres में मैं wo

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="\"entity_id_seq\"") 
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="\"pk_sequence\"") 
@Column(name="\"id\"", unique=true) 
private int id; 

अधिकतर बड़े नामों के साथ हाइबरनेट आदेश Postgres को समझते हैं और टेबल, कॉलम या नाम अनुक्रम खोजने के लिए बच गए उद्धरण पारित किया जाना चाहिए: uld यह करते हैं।

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