हाइबरनेट की PostgreSQL बोली बहुत उज्ज्वल नहीं है। यह आपके प्रति-सीरियल अनुक्रमों के बारे में नहीं जानता है, और यह मान रहा है कि "hibernate_sequence" नामक एक वैश्विक डेटाबेस-व्यापी अनुक्रम है जिसका वह उपयोग कर सकता है।
(अपडेट करें :ऐसा प्रतीत होता है कि नए हाइबरनेट संस्करण डिफ़ॉल्ट प्रति-तालिका अनुक्रमों का उपयोग कर सकते हैं जब GenerationType.IDENTITY
निर्दिष्ट किया जाता है। अपने संस्करण का परीक्षण करें और यदि यह आपके लिए काम करता है तो नीचे के बजाय इसका उपयोग करें।)
प्रत्येक अनुक्रम को स्पष्ट रूप से निर्दिष्ट करने के लिए आपको अपनी मैपिंग बदलने की आवश्यकता है। यह कष्टप्रद, दोहराव और व्यर्थ है।
@Entity
@Table(name = "JUDGEMENTS")
public class Judgement implements Serializable, Cloneable {
private static final long serialVersionUID = -7049957706738879274L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="judgements_id_seq")
@SequenceGenerator(name="judgements_id_seq", sequenceName="judgements_id_seq", allocationSize=1)
@Column(name = "JUD_ID")
private Long _judId;
...
allocationSize=1
काफी महत्वपूर्ण है। यदि आप इसे छोड़ देते हैं, तो हाइबरनेट आँख बंद करके मान लेगा कि अनुक्रम INCREMENT 50
से परिभाषित है इसलिए जब उसे किसी अनुक्रम से कोई मान मिलता है तो वह उस मान का उपयोग कर सकता है और उसके नीचे के 49 मान अद्वितीय उत्पन्न कुंजी के रूप में। यदि आपका डेटाबेस अनुक्रम 1 से बढ़ता है - डिफ़ॉल्ट - तो इसके परिणामस्वरूप अद्वितीय उल्लंघन होंगे क्योंकि हाइबरनेट मौजूदा कुंजियों का पुन:उपयोग करने का प्रयास करता है।
ध्यान दें कि एक बार में एक कुंजी प्राप्त करना होगा प्रति सम्मिलन एक अतिरिक्त राउंड ट्रिप में परिणाम। जहां तक मैं बता सकता हूं कि हाइबरनेट INSERT ... RETURNING
का उपयोग करने में सक्षम नहीं है जेनरेट की गई कुंजी को कुशलतापूर्वक वापस करने के लिए, न ही यह स्पष्ट रूप से जेडीबीसी जेनरेट की गई कुंजी इंटरफ़ेस का उपयोग कर सकता है। यदि आप इसे अनुक्रम का उपयोग करने के लिए कहते हैं, तो यह nextval
. को कॉल करेगा मान प्राप्त करने के लिए insert
स्पष्ट रूप से, जिसके परिणामस्वरूप दो दौर की यात्राएं हुईं। उस की लागत को कम करने के लिए, आप बहुत सारे इंसर्ट के साथ प्रमुख अनुक्रमों पर अधिक वृद्धि सेट कर सकते हैं, इसे मैपिंग पर सेट करना याद रखें और अंतर्निहित डेटाबेस अनुक्रम। इससे हाइबरनेट nextval
पर कॉल करेगा कम बार-बार और चाबियों के कैशे ब्लॉक को सौंपने के लिए।
मुझे यकीन है कि आप ऊपर से देख सकते हैं कि मैं यहाँ बनाए गए हाइबरनेट डिज़ाइन विकल्पों से सहमत नहीं हूँ, कम से कम PostgreSQL के साथ इसका उपयोग करने के दृष्टिकोण से। उन्हें getGeneratedKeys
. का उपयोग करना चाहिए या INSERT ... RETURNING
. का उपयोग कर रहे हैं DEFAULT
के साथ कुंजी के लिए, डेटाबेस को सीक्वेंस के नाम या उन तक स्पष्ट पहुंच पर स्वयं को परेशान किए बिना हाइबरनेट के बिना इसका ख्याल रखना।
बीटीडब्लू, यदि आप पीजी के साथ हाइबरनेट का उपयोग कर रहे हैं तो आप संभवतः पीजी के लिए एक ओपलॉक ट्रिगर भी चाहते हैं ताकि हाइबरनेट के आशावादी लॉकिंग को सामान्य डेटाबेस लॉकिंग के साथ सुरक्षित रूप से बातचीत करने की अनुमति मिल सके। इसके बिना या इसके जैसा कुछ आपके हाइबरनेट अपडेट अन्य नियमित SQL क्लाइंट के माध्यम से किए गए परिवर्तनों को रोक देगा। मुझसे पूछें कि मैं कैसे जानता हूं।