अपवाद 'इस वर्ग के लिए आईडी को सहेजने से पहले मैन्युअल रूप से असाइन किया जाना चाहिए ()' का अर्थ है कि आप 'असाइन किए गए' की पहचानकर्ता पीढ़ी की रणनीति का उपयोग कर रहे हैं।
<ब्लॉकक्वॉट>असाइन किया गया सेव() को कॉल करने से पहले एप्लिकेशन को ऑब्जेक्ट को पहचानकर्ता असाइन करने देता है। यदि कोई तत्व निर्दिष्ट नहीं है तो यह डिफ़ॉल्ट रणनीति है।
यदि आप किसी रणनीति को परिभाषित नहीं करते हैं, तो डिफ़ॉल्ट को 'असाइन' करने के लिए हाइबरनेट करें। 'असाइन' रणनीति का अर्थ है कि हाइबरनेट यह अपेक्षा करता है कि एप्लिकेशन अपनी आईडी प्रदान करे।
यदि आप Oracle में अनुक्रम आईडी जनरेटर का उपयोग करना चाहते हैं, तो आप निम्न कॉन्फ़िगरेशन के साथ ऐसा कर सकते हैं -
यदि आप xml का उपयोग कर रहे हैं -
<id name="countryId" type="java.lang.Integer">
<column name="Country_Id" />
<generator class="sequence">
<param name="sequence">Country_Id_Seq</param>
</generator>
</id>
यदि आप एनोटेशन का उपयोग कर रहे हैं -
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Country_Id_Seq")
@SequenceGenerator(name="Country_Id_Seq", sequenceName="Country_Id_Seq" )
private Integer sequence;
और आपका कोड ऐसा दिखना चाहिए -
Country c=new Country();
c.setCountryName(request.getParameter("txtCountryName"));
c.setCountryCode(request.getParameter("txtCountryCode"));
Zone z=(Zone) session.get(Zone.class, new BigDecimal(request.getParameter("zoneId")));
c.setZone(z);
session.save(c);
session.flush();
System.out.println(c.getCountryId());
जब 'session.save(c)' निष्पादित होता है, तो हाइबरनेट ओरेकल को निम्नलिखित एसक्यूएल कॉल करता है, आईडी पुनर्प्राप्त करता है और इसे देश ऑब्जेक्ट में सेट करता है।
select Country_Id_Seq.nextVal from dual;
ट्रिगर की समस्या
चूंकि आप एक पंक्ति डालने पर आईडी को बढ़ाने के लिए ट्रिगर का उपयोग कर रहे हैं, इससे हाइबरनेट अनुक्रम में समस्या होगी। हाइबरनेट एक आईडी उत्पन्न करने के लिए अनुक्रम का उपयोग कर रहा है और डेटाबेस आईडी को बढ़ाने के लिए ट्रिगर का उपयोग कर रहा है। इसके परिणामस्वरूप आईडी को दो बार बढ़ाया जा रहा है।
इसे हल करने के लिए आपके पास तीन विकल्प हैं।
-
ट्रिगर हटाएं क्योंकि यह आवश्यक नहीं है।
-
यदि आपको अभी भी ट्रिगर की आवश्यकता है क्योंकि तालिका को एप्लिकेशन के बाहर अपडेट किया जा सकता है, तो आप ट्रिगर को अपडेट कर सकते हैं जैसे कि आईडी केवल तभी उत्पन्न होती है जब आईडी सम्मिलित कथन में सेट नहीं होती है एक अनुक्रम से आईडी उत्पन्न करने के लिए ओरेकल ट्रिगर के साथ समस्या उत्पन्न करेंपी>
-
एक कस्टम आईडी जेनरेटर बनाएं जो डीबी में सहेजे जाने से पहले डेटा में आईडी सेट करने के लिए ट्रिगर का उपयोग करता है। निम्नलिखित लिंक देखें - https://forum.hibernate.org/viewtopic.php?t=973262