2013-07-17 7 views
42

मेरे पास एक ईजेबी है जहां मैं डेटाबेस को ऑब्जेक्ट सहेज रहा हूं। एक उदाहरण में मैंने देखा है, एक बार यह डेटा सहेजा गया है (EntityManager.persist) EntityManager.flush() पर एक कॉल है; मुझे ऐसा करने की ज़रूरत क्यों है? जिस वस्तु को मैं सहेज रहा हूं वह संलग्न नहीं है और बाद में विधि में उपयोग नहीं किया जाता है। वास्तव में, एक बार विधि रिटर्न बचाया और मैं संसाधनों को जारी होने की उम्मीद करता हूं। (उदाहरण के कोड के साथ-साथ एक निकालें फोन पर करता है।)EntityManager.flush क्या करता है और मुझे इसका उपयोग करने की आवश्यकता क्यों है?

if (somecondition) 
     entityManager.persist(unAttachedEntity); 
    else 
    { 
     attachedEntityObject.setId(unAttachedEntity.getId()); 
    } 
    entityManager.flush(); 

उत्तर

32

EntityManager.flush(); को एक कॉल EntityManager.persist() (कैसे EntityManager कॉन्फ़िगर किया गया है के आधार पर नहीं होगा तुरंत के रूप में डेटाबेस में जारी रहती है होना करने के लिए डेटा के लिए बाध्य करेगा: FlushModeType (ऑटो या COMMIT) डिफ़ॉल्ट रूप से यह ऑटो पर सेट हो जाता है और अंतर्निहित डेटाबेस में डेटा की पर्सिनेशन को COMMIT करने के लिए सेट होने पर फ्लश स्वचालित रूप से किया जाएगा लेनदेन कब किया जाएगा)।

+5

'फ्लशमोड टाइप' का विवरण सही नहीं है: मूल रूप से ऑटो का अर्थ है कि यदि आप एक इकाई बदलते हैं और बाद में एक चयन क्वेरी बनाते हैं जो उस इकाई को वापस कर सकता है, तो ऑटो उस निष्पादन में परिवर्तन को लागू करने से पहले फ़्लैश करने के लिए मजबूर करेगा। –

14

EntityManager.persist() एक इकाई को लगातार बना देता है जबकि EntityManager.flush() वास्तव में आपके डेटाबेस पर क्वेरी चलाता है।

तो, जब आप EntityManager.flush() पर कॉल करते हैं, तो संबंधित इकाइयों को सम्मिलित/अद्यतन/हटाने के लिए क्वेरी डेटाबेस में निष्पादित की जाती हैं। किसी भी बाधा विफलताओं (कॉलम चौड़ाई, डेटा प्रकार, विदेशी कुंजी) इस समय जाना जाएगा।

ठोस व्यवहार इस बात पर निर्भर करता है कि फ्लश-मोड ऑटो या COMMIT है या नहीं।

13

EntityManager.flush() ऑपरेशन का उपयोग लेनदेन से पहले डेटाबेस में सभी परिवर्तनों को लिखने के लिए किया जा सकता है। डिफ़ॉल्ट रूप से जेपीए आमतौर पर लेनदेन किए जाने तक डेटाबेस में परिवर्तन नहीं लिखता है। यह आमतौर पर वांछनीय है क्योंकि यह आवश्यक होने तक डेटाबेस पहुंच, संसाधन और ताले से बचाता है। यह डेटाबेस लिखने का आदेश भी देता है, और इष्टतम डेटाबेस पहुंच के लिए बैच किया गया है, और अखंडता बाधाओं को बनाए रखने और deadlocks से बचने के लिए। इसका अर्थ यह है कि जब आप डेटाबेस को डीएमएल INSERT, , DELETE को जारी रखते हैं, मर्ज करते हैं या हटाते हैं, तब तक निष्पादित नहीं किया जाता है जब तक कि प्रतिबद्ध न हो, या फ्लश ट्रिगर न हो जाए।

+1

EntityManager.flush() ऑपरेशन का उपयोग लेनदेन किए जाने से पहले डेटाबेस में सभी परिवर्तनों को लिखने के लिए किया जा सकता है। -> यह पूरी तरह से सच नहीं है। आपको अभी भी प्रतिबद्ध करने की आवश्यकता है, फ्लश केवल प्रतिबद्धता के बिना डेटाबेस में SQL कथन भेजता है। प्रतिबद्धता के बिना फ्लश ट्रिगर करना वास्तव में किसी भी संस्था में प्रवेश नहीं करेगा। प्रतिबद्धता आपके लिए फ्लश होगी, अगर आपने पहले से ही फ्लश नहीं किया है, लेकिन फ्लश प्रतिबद्ध नहीं होगा .. –

+0

EntityManager.flush() डेटाबेस को डेटा भेज देगा, लेकिन यह इस बिंदु पर दूसरों के लिए दृश्यमान नहीं होगा। इसके बजाए, बदली गई डेटाबेस प्रविष्टियों को एक पंक्ति लॉक मिलेगा। लेकिन केवल प्रतिबद्धता के बाद() परिवर्तन दूसरों के लिए दृश्यमान हो जाते हैं, और ताले हटा दिए जाते हैं। – user2081279

8

तो जब आप EntityManager.persist() पर कॉल करते हैं, तो यह केवल EntityManager द्वारा प्रबंधित किया जाता है और इसे 0 इकाईपर (इकाई उदाहरण) जोड़ता है। एक स्पष्ट flush() डेटाबेस को स्थानांतरित करने के लिए अब Persistence Context में इकाई बना रहा है (SQL का उपयोग करके)।

फ्लश() के बिना, यह (Persistence Context से डेटाबेस में इकाई को स्थानांतरित करना) तब होगा जब लेनदेन इस Persistence Context से जुड़ा हुआ है।

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

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