2012-02-27 9 views
7

हाइबरनेट में पोस्टग्रेस्क्ल के लिए डिफ़ॉल्ट पहचानकर्ता जेनरेटर अनुक्रम जेनरेटर [1] है। i.e. हाइबरनेट SELECT nextval('hibernate_sequence') सत्र प्रतिबद्धता पर INSERT foo (id, ...) VALUES (123, ...) करने से पहले एक आईडी उत्पन्न करने के लिए करेगा।PostgreSql "अनुक्रम जेनरेटर" के लिए हाइबरनेट डिफ़ॉल्ट जनरेटर क्यों है, "पहचान जनरेटर" नहीं?

हालांकि, PostgreSql ऑटोइनक्रिएशन आईडी कॉलम का समर्थन करता है (उदाहरण के लिए [2]), और ऑटोइनक्रिकमेंट का समर्थन करने वाले अन्य सभी डेटाबेस के लिए डिफ़ॉल्ट जनरेटर उस सुविधा का उपयोग करना है [3], और आईडी मान को छोड़कर और क्वेरी को सम्मिलित करने के लिए नई आईडी के लिए डेटाबेस (सत्र प्रतिबद्ध होने से पहले, लेकिन सत्र के लेनदेन के भीतर)।

मैंने कुछ हालिया चर्चा देखी है [4] यह बताते हुए कि पूर्व रणनीति सामान्य रूप से बेहतर है, सम्मिलित-सत्र-सत्र-मेल-मिलाप के कारण।

यदि अनुक्रम जेनरेटर बेहतर है ([4] के अनुसार), यह डेटाबेस का डिफ़ॉल्ट क्यों नहीं है जो इसे समर्थन देता है (देखें [3])?

यदि पहचान जनरेटर बेहतर है, तो PostgreSql स्पष्ट रूप से अनुक्रम जेनरेटर क्यों चुनता है जब पोस्टग्रेर्स पूर्व का समर्थन करता है ([2] के अनुसार)?

मैंने पोस्टग्रेस बोली में डिफ़ॉल्ट को ओवरराइड करने के निर्णय का इतिहास खोजने का प्रयास किया (देखें [1]), लेकिन मुझे गिटहब में प्रासंगिक प्रतिबद्धता नहीं मिली। मैंने एसवीएन रिपोजिटरी में वापस कोड का पालन किया है, लेकिन निशान ठंडा हो जाता है जहां postgreSQLDialect फ़ाइल r11563 पर "मैवेन माइग्रेशन" [5] के एक अनुपयोगी प्रतिबद्ध संदेश के साथ जोड़ा जाता है। मैं इतिहास को आगे और पीछे नहीं देख सकता। क्या कोई इस प्रतिबद्धता को जोड़ सकता है जो इस ओवरराइड को जोड़ता है? शायद प्रतिबद्ध संदेश में और जानकारी है।

अग्रिम धन्यवाद।

[1] https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQL81Dialect.java#L267

[2] PostgreSQL Autoincrement

[3] https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java#L639

[4] http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx

[5] https://source.jboss.org/browse/Hibernate/core/trunk/core/src/main/java/org/hibernate/dialect/PostgreSQLDialect.java?focusedRev=14993&fromRev=11563&toRev=14993#r14993

+3

मुझे लगता है कि ऐसा इसलिए है क्योंकि 'सीरियल' डेटाटाइप सिर्फ "छिपाने में अनुक्रम" है। –

+0

यह इसकी व्याख्या नहीं करता है - सभी ऑटोइनक्रिकमेंट कॉलम छिपाने में अनुक्रम हैं। – Rich

+0

नहीं, SQL सर्वर या MySQL के लिए नहीं, जहां आप उस प्रविष्टि के बिना अगला मान नहीं प्राप्त कर सकते हैं (जो अनुक्रम आधारित समाधान और "ऑटो-वृद्धि" के बीच बड़ा अंतर है) –

उत्तर

2

शायद क्योंकि जनरेटर आमतौर पर एनएचबीर्नेट में पीजी के लिए टूटा जाता है क्योंकि यह ओरेकल स्टाइल आउट-पैरामीटर शैली का उपयोग करता है जो npgsql-ADONET ड्राइवर द्वारा समर्थित नहीं है जो परिणाम परिणाम के रूप में परिणाम देता है और पैरामीटर नहीं।

एसक्यूएल: अंदर प्रवेश .... आईडी को nhoutparameter में वापस कर रहा है; : noutoutameter = शून्य;

ओरेकल का उपयोग कर इस

command.Execute(); 
object id = command.Parameter["nhoutparameter"].Value; 
Assert.NotNull(id); 
पीजी में

काम करता है नहीं। यह

object id = command.ExecuteScalar(); 
+0

यह NHibernate के लिए समझ में आता है। क्या आपको पता है कि यह हाइबरनेट पर लागू होता है? – Rich

+0

शायद। मेरे पास परीक्षण करने के लिए पर्यावरण नहीं है। एनएच के लिए मुझे अभी स्रोत मिला और पीजी के खिलाफ यूनिटटेस्ट चलाया। सभी पोस्टइन्सर्ट जेनरेटर-परीक्षण विफल रहे। आप पीजी के खिलाफ चल रहे गिथब से हाइबरनेट्ससोर्स के साथ ऐसा ही कर सकते हैं। – Firo

0

यह सिर्फ के बाद से मैं अटकलें पोस्टग्रेस पर अच्छी सुविधा/संस्करण दस्तावेज़ नहीं मिल सकता है लेकिन ...

शायद पोस्टग्रेज़ बोली को धारावाहिक लागू करने, स्थिर, व्यापक रूप से उपयोग करने या बोली लगाने वाले डेवलपर्स को इसके बारे में पता था, इससे पहले ही जोड़ा गया था। एक बोली के लिए डिफ़ॉल्ट पहचानकर्ता जेनरेटर बदलना एक तोड़ने वाला परिवर्तन होगा और वे खराब हैं।

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