हाइबरनेट में बैच प्रविष्टि के लिए आईडी जनरेशन रणनीति महत्वपूर्ण है। विशेष रूप से, पहचान पीढ़ी आमतौर पर नहीं होगी काम (ध्यान दें कि ऑटो आमतौर पर पहचान के लिए भी मैप करता है)। ऐसा इसलिए है क्योंकि बैच डालने के दौरान हाइबरनेट में "requiresImmediateIdAccess" नामक ध्वज होता है जो कहता है कि जेनरेट की गई आईडी तत्काल आवश्यक हैं या नहीं; अगर ऐसा है, तो बैच प्रोसेसिंग अक्षम है।
आप इसे आसानी से DEBUG-स्तर के लॉग में देख सकते हैं जब यह कहता है "पहचान-सम्मिलित करना तुरंत निष्पादित करना" - इसका मतलब है कि इसने बैच प्रसंस्करण को छोड़ दिया है क्योंकि यह बताया गया था कि प्रविष्टि के तुरंत बाद उत्पन्न आईडी की आवश्यकता होती है।
जनरेशन रणनीतियाँ जो आमतौर पर करती हैं कार्य तालिका और अनुक्रम हैं, क्योंकि हाइबरनेट आईडी को पूर्व-जनरेट कर सकता है, जिससे बैच प्रविष्टि की अनुमति मिलती है।
यह पता लगाने का एक त्वरित तरीका है कि आपका बैच प्रविष्टि काम करता है या नहीं, DEBUG- स्तर के लॉग को सक्रिय करना है क्योंकि बैचिंगबैचर आपको स्पष्ट रूप से उस बैच आकार को बताएगा जो यह निष्पादित कर रहा है ("एक्ज़ीक्यूटिंग बैच आकार:" + बैचसाइज़ )।
साथ ही, निम्न गुण बैच प्रविष्टि प्राप्त करने के लिए महत्वपूर्ण हैं। मैं यह कहने की हिम्मत नहीं करता कि वे आवश्यक हैं क्योंकि मैं ऐसा करने के लिए एक हाइबरनेट-विशेषज्ञ के रूप में पर्याप्त नहीं हूं - शायद यह सिर्फ मेरा विशेष विन्यास है - लेकिन मेरे अनुभव में फिर भी उनकी आवश्यकता थी:
hibernate.order_inserts = true
hibernate.order_updates = true
इन गुणों को बहुत खराब तरीके से प्रलेखित किया गया है, लेकिन मेरा मानना है कि उन्होंने जो किया वह SQL INSERT और UPDATE स्टेटमेंट को बैच निष्पादन के लिए ठीक से समूहीकृत करने के लिए सक्षम था; मुझे लगता है कि यह आपके बाद की बहु-पंक्ति प्रविष्टियां हो सकती है। अगर मैं इस पर गलत हूं तो मुझे गोली मत मारो, मुझे स्मृति से याद आ रहा है।
मैं भी आगे बढ़ूंगा और मान लूंगा कि आपने निम्नलिखित संपत्ति निर्धारित की है; यदि नहीं, तो यह एक अनुस्मारक के रूप में काम करना चाहिए:
hibernate.jdbc.batch_size = xx
जहां xx स्वाभाविक रूप से आपका वांछित बैच आकार है।