2012-06-15 18 views
39

डेटाबेस को अपडेट करते समय मुझे क्या पसंद करना चाहिए? & पेशेवरों को किसी भी विधि के साथ क्या हैं और मैं एक या दूसरे का उपयोग कब करूं?Entitymanager.flush() वीएस EntityManager.getTransaction() प्रतिबद्ध - मुझे क्या पसंद करना चाहिए?

public void disemployEmployee(Integer employeeId, Date endDate) { 
    Employee employee = (Employee)em.find("Employee", employeeId); 
    employee.getPeriod().setEndDate(endDate); 
    em.flush(); 
} 

public void disemployEmployee(Integer employeeId, Date endDate) { 
    Employee employee = (Employee)em.find("Employee", employeeId); 
    em.getTransaction().begin(); 
    employee.getPeriod().setEndDate(endDate); 
    em.getTransaction().commit(); 
} 

उत्तर

42

अपने पहले उदाहरण में, डेटा में परिवर्तन फ्लश का सामना करने के बाद डेटाबेस में परिलक्षित होते हैं, लेकिन यह अभी भी है लेनदेन में

लेकिन दूसरे उदाहरण में, आप तुरंत लेनदेन कर रहे हैं। इसलिए डेटाबेस & लेनदेन में किए गए परिवर्तन भी समाप्त होते हैं।

कभी-कभी चल रहे लेनदेन & के बीच डेटा को जारी रखने के लिए फ्लश उपयोगी हो सकता है और अंततः बाद में परिवर्तनों को पूरा कर सकता है। तो यदि बैच डालने/अपडेट के लिए कुछ समस्या होती है तो आप पिछले परिवर्तनों को भी रोलबैक कर सकते हैं।

+8

पहले उदाहरण में कोई लेनदेन नहीं है, इसलिए फ्लश() पर एक अपवाद फेंक दिया गया है। – DataNucleus

+1

@ डेटाटाइक्लियस मुझे सीएमटी में लगता है, हमें मैन्युअल रूप से लेनदेन शुरू/समाप्त करने की आवश्यकता नहीं है। –

+2

यकीन है लेकिन क्या वह सीएमटी में है? अपने दूसरे उदाहरण में वह टीएक्सएन शुरू करता है, इसलिए यह एकमात्र धारणा है जिसे मैं – DataNucleus

14

आप फ्लश के लिए जावाडोक पढ़ सकते हैं और प्रतिबद्ध हैं और जानते हैं कि फ्लश केवल एक सौदे के भीतर उपयोग के के लिए है किया? यह flushes (लेकिन प्रतिबद्ध नहीं है), जबकि प्रतिबद्ध डेटा (स्पष्ट रूप से) करता है। वे अलग हैं; होने के लिए कोई "वरीयता" नहीं है। पहला उदाहरण गलत है, और इसके परिणामस्वरूप फ्लश (ट्रांज़ेक्शनआरक्वर्डएक्सप्शन)

+1

मैं फ्लश() है कि मैं फ्लश का उपयोग किए बिना ऐसा नहीं कर सकते (साथ क्या कर सकते हैं उम्मीद है)? – Rox

+1

फ्लश डेटा को डेटास्टोर में रखता है, और इसके बिना डेटा वहां नहीं है, इसलिए प्रश्न बालों वाले डेटा को वापस कर सकते हैं। शायद फ्लश पर जेपीए स्पेक पढ़ें() – DataNucleus

+2

ठीक है, एपीआई फ्लश() के बारे में जो कुछ भी कहता है वह है "अंतर्निहित डेटाबेस में दृढ़ता संदर्भ को सिंक्रनाइज़ करें" और मैंने पहले कभी इसका उपयोग नहीं किया है, लेकिन मेरे लेन-देन अभी भी डेटा को डाटाबेस पर रखकर ' EntityManager.getTransaction.commit() '। और मैंने EntityManager.flush() नहीं कहा है! इसलिए मैं फ्लश() के उपयोग को समझ नहीं पा रहा हूं जब आप इसके बिना सब कुछ कर सकते हैं। – Rox

3

आपके दोनों कोड नमूने डीबी को लिखे जाने वाले इकाई स्थिति को जारी या विलय नहीं कर सकते हैं।

मुझे नहीं लगता कि EntityManager.flush() और EnityManager.EntityTransaction.commit() की तुलना करना उचित नहीं है।

फ्लश() एक लेनदेन संदर्भ में संलग्न होना चाहिए और जब तक आवश्यक नहीं है (दुर्लभ मामलों में), जब तक EntityTransaction.commit() आपके लिए यह नहीं करता है तब तक इसे स्पष्ट रूप से करने की आवश्यकता नहीं है।

इस लिंक Is it necessary to call a flush() (JPA interface) in this situation?

देखें एक परिदृश्य के लिए इस लिंक Question about flushing with JPA before a query is called देखें उपयोग करने के लिए फ्लश()

+0

जैसा कि मैंने डेटा न्यूक्लियस से पूछा था: फ्लश() के साथ मैं क्या कर सकता हूं कि मैं इसका उपयोग किए बिना नहीं कर सकता? – Rox

+0

मेरा जवाब अपडेट किया गया। उम्मीद है कि लिंक आपके प्रश्न का उत्तर देगा। –

+0

@AhamedMustafaM 'आपके दोनों कोड नमूने डीबी 'नहीं, अगर इकाई प्रबंधित की जाती है, तो इकाई स्थिति को जारी या विलय नहीं करती है, तो परिवर्तन डेटाबेस में सिंक्रनाइज़ किए जाएंगे। –

0

जब भी संभव हो मैं कंटेनर प्रबंधित लेनदेन के लिए जाऊंगा। अपरिपक्व संभावनाओं के कारण बीन प्रबंधित लेन-देन में आमतौर पर अधिक कोड की आवश्यकता होती है। साथ ही, यह अधिक त्रुटि प्रवण (रोलबैक, संसाधन प्रबंधन) है।

उस ने कहा, मैं कंटेनर प्रबंधित मोड में प्रतिबद्धता के बाद फ्लश का उपयोग करूंगा। इस तरह से मैं अपने स्टोरेज मॉड्यूल में संभावित पर्सिस्टेंस अपवादों को पकड़ सकता हूं और इसे अपने उपयोग केस मॉड्यूल के लिए कुछ और सार्थक अपवाद में परिवर्तित कर सकता हूं। ऐसा इसलिए है क्योंकि मैं स्टोरेज-विशिष्ट अपवादों को यहां संभाल नहीं लेना चाहता हूं, क्योंकि मैं जेपीए का उपयोग नहीं करने वाले किसी भी चीज़ के लिए स्टोरेज मॉड्यूल को स्वैप कर सकता हूं ... जो कभी मेरे साथ नहीं हुआ :)

0

मुझे लगता है कि गायब हिस्सा है , फ्लश() बस डेटा स्रोतों को प्रतिबद्ध करने के लिए तैयार होने के लिए जोड़ें, वास्तविक आईडी देता है लेकिन डिफ़ॉल्ट रूप से जारी नहीं रहता है।

आप की जरूरत तो अगर() के रूप में काम करने() आपके द्वारा EntityManager में कमिट करने के लिए फ्लश मोड निर्धारित करने की आवश्यकता के लिए फ्लश:

void setFlushMode(FlushModeType flushMode) 
Set the flush mode that applies to all objects contained in the persistence context. 

ध्यान दें कि FlushModeType एक enum इन दो मानों किया है:

फ्लशमोड टाइप ऑटो (डिफ़ॉल्ट) क्वेरी निष्पादन पर होने वाली फ्लशिंग। चूंकि: जेपीए 1।0 FlushModeType COMMIT लेनदेन प्रतिबद्धता पर होने वाली फ्लशिंग। प्रदाता अन्य समय पर फ्लश कर सकता है, लेकिन इसकी आवश्यकता नहीं है। के बाद से: जेपीए 1,0

मैं इस मदद