जवाबों:
सत्र को निस्तब्धता हाइबरनेट को Session
डेटाबेस की इन-मेमोरी स्थिति (यानी डेटाबेस में परिवर्तन लिखने के लिए) को सिंक्रनाइज़ करने के लिए मजबूर करता है। डिफ़ॉल्ट रूप से, हाइबरनेट आपके लिए परिवर्तनों को स्वचालित रूप से प्रवाहित करेगा:
स्पष्ट रूप से फ्लश करने की अनुमति देने से Session
महीन नियंत्रण मिलता है जो कुछ परिस्थितियों में आवश्यक हो सकता है (एक आईडी प्राप्त करने के लिए, सत्र के आकार को नियंत्रित करने के लिए ...)।
id = session.save(obj);
और लेनदेन बहुत अगली पंक्ति में प्रतिबद्ध है, लेकिन obj सहेजा नहीं जा रहा है DB के लिए, क्यों? 2) मैंने session.save(obj);
कमिट का उपयोग करते हुए return obj.getprimaryID();
obj को सेव किया और वापस आते समय मैंने उपयोग किया इस मामले में obj को DB में सहेजा गया है। तो यह व्यवहार क्यों हो रहा है?
जैसा कि ऊपर दिए गए उत्तरों में सही कहा गया है, flush()
हम कॉल करके हाइबरनेट को डेटाबेस पर SQL कमांड को निष्पादित करने के लिए मजबूर करते हैं। लेकिन समझते हैं कि परिवर्तन अभी "प्रतिबद्ध" नहीं हैं। इसलिए फ्लश करने के बाद और कमिट करने से पहले, यदि आप सीधे DB (SQL प्रॉम्प्ट से कहते हैं) तक पहुँचते हैं और संशोधित पंक्तियों की जाँच करते हैं, तो आपको बदलाव नहीं दिखेंगे।
यह 2 SQL कमांड सत्र खोलने के समान है। और 1 सत्र में किए गए परिवर्तन दूसरों के लिए प्रतिबद्ध नहीं हैं।
मैं केवल यह जानता हूं कि जब हम session.flush()
अपने बयानों को डेटाबेस में निष्पादित करते हैं, लेकिन प्रतिबद्ध नहीं होते हैं।
मान लीजिए कि हम flush()
सत्र वस्तु पर विधि नहीं कहते हैं और अगर हम प्रतिबद्ध विधि कहते हैं, तो यह आंतरिक रूप से डेटाबेस पर कथनों को निष्पादित करने और फिर कमिट करने का काम करेगा।
commit=flush+commit
(कार्यक्षमता के मामले में)
इस प्रकार, मैं यह निष्कर्ष निकालता हूं कि जब हम सत्र ऑब्जेक्ट पर विधि फ्लश () कहते हैं, तो यह प्रतिबद्ध नहीं होता है, लेकिन डेटाबेस को हिट करता है और क्वेरी को निष्पादित करता है और रोलबैक भी प्राप्त करता है।
लेनदेन करने के लिए हम लेनदेन वस्तु पर कमिट () का उपयोग करते हैं।
सत्र को फ्लशिंग करने से वह डेटा मिलता है जो वर्तमान में डेटाबेस में मौजूद सत्र के साथ सिंक्रनाइज़ है।
हाइबरनेट वेबसाइट पर अधिक:
flush()
उपयोगी है, क्योंकि सत्र JDBC कॉल को निष्पादित करने के बारे में कोई गारंटी नहीं है, केवल उस क्रम में जिसमें वे निष्पादित किए जाते हैं - सिवाय आपके उपयोग के flush()
।
आप flush
लेन-देन के प्रतिबद्ध होने के बजाय एक ज्ञात स्थान पर मान्यता बाधाओं का पता लगाने और उनका उपयोग करने के लिए बाध्य करने के लिए उपयोग कर सकते हैं । यह हो सकता है कि commit
घोषणात्मक तर्क, कंटेनर या एक टेम्पलेट के माध्यम से कुछ रूपरेखा तर्क द्वारा निहित हो। इस मामले में, फेंके गए किसी भी अपवाद को पकड़ना और संभालना मुश्किल हो सकता है (यह कोड में बहुत अधिक हो सकता है)।
उदाहरण के लिए, यदि आपके पास save()
एक नया EmailAddress ऑब्जेक्ट है, जिसमें पते पर एक अद्वितीय बाधा है, तो आपको तब तक कोई त्रुटि नहीं मिलेगी जब तक आप प्रतिबद्ध नहीं होते।
कॉलिंग flush()
पंक्ति को सम्मिलित करने के लिए बाध्य करता है, यदि कोई डुप्लिकेट है, तो अपवाद को फेंकना।
हालांकि, आपको अपवाद के बाद सत्र को वापस रोल करना होगा।
मैं बस ऊपर दिए गए सभी उत्तरों को क्लब करना चाहूंगा और सत्रांक.सेवे () के साथ फ्लश () विधि को भी अधिक महत्व देना चाहूंगा।
डेटाबेस को इकाई को बचाने के लिए हाइबरनेट सेव () का उपयोग किया जा सकता है। हम इस पद्धति को लेनदेन से बाहर कर सकते हैं, इसीलिए मुझे डेटा सहेजने की यह विधि पसंद नहीं है। यदि हम बिना लेन-देन के इसका उपयोग करते हैं और हमारे पास संस्थाओं के बीच कास्केडिंग है, तो केवल प्राथमिक संस्था बच जाती है, जब तक कि हम सत्र को फ्लश नहीं करते।
फ्लश (): सत्र को फ्लश करने के लिए मजबूर करता है। इसका उपयोग डेटाबेस के साथ सत्र डेटा को सिंक्रनाइज़ करने के लिए किया जाता है।
जब आप session.flush () कॉल करते हैं, तो स्टेटमेंट्स डेटाबेस में निष्पादित होते हैं लेकिन यह प्रतिबद्ध नहीं होगा। यदि आप session.flush () को कॉल नहीं करते हैं और यदि आप session.commit () को कॉल करते हैं, तो आंतरिक रूप से प्रतिबद्ध () विधि स्टेटमेंट को निष्पादित करती है और शुरू होती है।
तो कमिट () = फ्लश + कमिट। इसलिए session.flush () केवल डेटाबेस में स्टेटमेंट्स को निष्पादित करता है (लेकिन कमिट नहीं होता है) और स्टेटमेंट अब मेमरी में नहीं हैं। यह सिर्फ सत्र को फ्लश करने के लिए मजबूर करता है।
कुछ महत्वपूर्ण बिंदु:
हमें बाहरी लेन-देन की सीमा को बचाने से बचना चाहिए, अन्यथा मैप की गई संस्थाओं को डेटा असंगति के कारण बचाया नहीं जाएगा। सत्र को फ्लश करना भूल जाना बहुत सामान्य है क्योंकि यह कोई अपवाद या चेतावनी नहीं देता है। डिफ़ॉल्ट रूप से, हाइबरनेट आपके लिए स्वचालित रूप से परिवर्तनों को फ्लश करेगा: कुछ क्वेरी निष्पादित होने से पहले जब कोई लेनदेन किया जाता है, तो सत्र को स्पष्ट रूप से फ्लश करने की अनुमति देने से कुछ परिस्थितियों में (एक आईडी प्राप्त करने के लिए, सत्र का आकार नियंत्रित करने के लिए आवश्यक हो सकता है) )
flush()
विधि सत्र फ्लश करने के लिए हाइबरनेट कारण बनता है। आप setFlushMode()
विधि का उपयोग करके सत्र के लिए फ्लशिंग मोड का उपयोग करने के लिए हाइबरनेट को कॉन्फ़िगर कर सकते हैं । वर्तमान सत्र के लिए फ्लश मोड प्राप्त करने के लिए, आप getFlushMode()
विधि का उपयोग कर सकते हैं । यह देखने के लिए कि क्या सत्र गंदा है, आप उपयोग कर सकते हैंisDirty()
विधि का । डिफ़ॉल्ट रूप से, हाइबरनेट सत्रों के फ्लशिंग का प्रबंधन करता है।
जैसा कि प्रलेखन में कहा गया है:
https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/flushing/Flushing.html
फ्लशिंग
निस्तब्धता अंतर्निहित डेटाबेस के साथ दृढ़ता संदर्भ की स्थिति को सिंक्रनाइज़ करने की प्रक्रिया है।
EntityManager
और हाइबरनेटSession
तरीकों का एक सेट, जिसके माध्यम से आवेदन डेवलपर एक इकाई की लगातार राज्य को बदल सकते हैं बेनकाब।दृढ़ता संदर्भ किसी भी इकाई स्थिति परिवर्तन को कतारबद्ध करते हुए, ट्रांसेक्शनल लिखने के पीछे कैश के रूप में कार्य करता है। किसी भी लिखने के पीछे कैश की तरह, परिवर्तन पहली बार मेमोरी में लागू होते हैं और फ्लश समय के दौरान डेटाबेस के साथ सिंक्रनाइज़ होते हैं। फ्लश ऑपरेशन हर इकाई को बदलता है और इसे ए
INSERT
,UPDATE
या में अनुवाद करता हैDELETE
कथन में ।फ्लशिंग रणनीति वर्तमान चल रहे हाइबरनेट सत्र के फ्लशमोड द्वारा दी गई है । हालांकि जेपीए केवल दो फ्लशिंग रणनीतियों (
AUTO
औरCOMMIT
) को परिभाषित करता है , हाइबरनेट में फ्लश प्रकारों का अधिक व्यापक स्पेक्ट्रम है:
ALWAYS
: हर प्रश्न से पहले सत्र फ्लश;AUTO
: यह डिफ़ॉल्ट मोड है और यदि आवश्यक हो तो ही सत्र निकाल देता है;COMMIT
: सेशन फ्लश में देरी करने की कोशिश करता है जब तक कि करंट ट्रांजैक्शन नहीं हो जाता है, हालांकि यह समय से पहले भी फ्लश हो सकता है;MANUAL
: सत्र निस्तब्धता आवेदन के लिए प्रत्यायोजित है, जिसेSession.flush()
दृढ़ता संदर्भ परिवर्तनों को लागू करने के लिए स्पष्ट रूप से कॉल करना चाहिए ।डिफ़ॉल्ट रूप से, हाइबरनेट
AUTO
फ्लश मोड का उपयोग करता है जो निम्नलिखित परिस्थितियों में फ्लश चलाता है:
- लेनदेन करने से पहले;
- एक JPQL / HQL क्वेरी को निष्पादित करने से पहले जो कतारबद्ध निकाय क्रियाओं के साथ ओवरलैप होता है;
- किसी भी मूल SQL क्वेरी को निष्पादित करने से पहले जिसका कोई पंजीकृत सिंक्रनाइज़ेशन नहीं है।
कॉलिंग EntityManager#flush
है दुष्प्रभाव । यह आसानी से उत्पन्न आईडी मान (अनुक्रम मान) के साथ इकाई प्रकारों के लिए उपयोग किया जाता है: ऐसी आईडी अंतर्निहित दृढ़ता परत के साथ सिंक्रनाइज़ेशन पर ही उपलब्ध है। यदि वर्तमान लेनदेन समाप्त होने से पहले (उदाहरण के लिए लॉगिंग उद्देश्यों के लिए) यह आईडी आवश्यक है, तो सत्र को फ्लश करना आवश्यक है।