2012-11-27 11 views
19

मैं एक उदाहरण के साथ सवाल प्रस्तुत करता हूं।वसंत डेटा जेपीए - एक लौटाई गई इकाई में परिवर्तन क्यों स्वचालित रूप से बने रहते हैं?

का दावा है कि हम इस तरह के नीचे के रूप में एक भंडार है:,

T findOne(ID id); 

अब, मुझे लगता है कि देखा है:

public interface ExampleObjectRepository extends CrudRepository<ExampleObject, Long> { 

} 

JpaRepository इंटरफ़ेस विस्तार करके, ExampleObject भंडार निम्न विधि विरासत अगर मुझे इस विधि को कॉल करने के बाद exampleObject का संदर्भ प्राप्त होता है, तो मैं इस विधि में जो भी जोड़ता हूं, वह स्वचालित रूप से डेटाबेस में सहेजा जाता है, उदाहरण के लिए:

ExampleObject pointInCase = exampleObjectRepository.findOne(1L); 
pointInCase.setName("Something else"); 

विषय के चारों ओर पढ़ना, मैं यह संकेतों को समझता हूं कि ExampleObject उदाहरण not detached है।

यह मेरी अपेक्षाओं के विरुद्ध चला जाता है। मैं उम्मीद है कि मैं परिवर्तनों को सहेजने के लिए बचाने के लिए विधि CrudRepository से विरासत में मिला उनका उपयोग करना होगा:

T save(T entity); 

चाहेंगे किसी को भी इस बात की पुष्टि करने के लिए तरह पर्याप्त है कि वस्तुओं एक स्प्रिंग डाटा जेपीए भंडार से लौटे मानक के रूप में संलग्न रहते हैं हो , और रिपॉजिटरी में किसी विधि को चिह्नित करने के लिए एपीआई का उपयोग कैसे करें, यह बताएं कि यह केवल अलग संदर्भ देता है?

मुझे लगता है कि इकाई की स्थिति को बदलने से इसकी परिभाषा भी बदल सकती है जब इसका उपयोग save(T entity) विधि के साथ किया जाता है, इसलिए मैं यह समझने की भी सराहना करता हूं कि अद्यतनों की पहचान कैसे की जाती है।

उत्तर

14

यह जेपीए का एक मौलिक सिद्धांत है। आप संलग्न (प्रबंधित) इकाइयों के साथ काम करते हैं, और इन प्रबंधित इकाइयों पर किए गए प्रत्येक संशोधन को स्वचालित रूप से लगातार बना दिया जाता है।

यदि आप नहीं चाहते हैं कि आपके परिवर्तन लगातार बने रहें, तो परिवर्तन न करें, या लेनदेन को रोलबैक न करें।

अलग-अलग इकाइयों पर काम करना एक दुःस्वप्न होगा, क्योंकि यह सभी संगठनों को आलसी लोडिंग को रोक देगा। आप अपनी संस्थाओं पर हमेशा EntityManager.detach() पर कॉल कर सकते हैं, लेकिन मैं वास्तव में ऐसा नहीं करूँगा। बस यह समझने की कोशिश करें कि यह कैसे काम करता है और इससे निपटता है। नुकसान से ज्यादा लाभ हैं। उनमें से एक यह है कि आपको जटिल परिवर्तन तर्क के सभी परिवर्तनों को सहेजने के बारे में भी सोचना नहीं है, क्योंकि यह आपके लिए जेपीए द्वारा पारदर्शी रूप से किया गया है।

+0

आपकी टिप्पणियों के लिए धन्यवाद - वे निश्चित रूप से कार्यालय के आसपास अन्य राय के साथ संगत हैं!हालांकि इस मामले में कि कई पीओजेओ मैनिपुलेशन लेनदेन के हिस्से के रूप में किए जाते हैं, क्या यह व्यवहार विधि की लेनदेन संबंधी प्रकृति को तोड़ देगा? – 8bitjunkie

+1

यह क्यों होगा? आप एक लेनदेन शुरू करते हैं, किसी भी संख्या में आप जो भी संशोधन चाहते हैं उसे संशोधित करें और अपनी इच्छित संस्थाओं के प्रकार बनाएं, और फिर लेनदेन करें। या तो सभी परिवर्तन किए गए हैं, या सभी परिवर्तन रोलबैक हैं। किसी विधि का लेनदेन संबंधी पहलू यह भी लागू होने वाली प्रत्येक आंतरिक विधि पर लागू होता है: लेनदेन संदर्भ प्रचारित होता है। –

+0

तो ... कॉलिंग 'सेव' विधि अनावश्यक है जब तक कि आप अलग न हों? या मुझे यह सुनिश्चित करने के लिए कुछ और तरीका कहना चाहिए कि जेपीए रोलबैक के बजाय लेनदेन बंद कर दे? – kiedysktos

5

यदि आपका लेनदेन भंडार में स्कॉप्ड किया गया है तो आप अपनी रिपोजिटरी रिटर्न अलग-अलग इकाइयां बना सकते हैं। अर्थात। आपका लेन-देन भंडार में प्रवेश के साथ शुरू होता है और जब आप रिपोजिटरी से बाहर निकलते हैं तो बंद हो जाता है।

यदि आप इस तरह काम करते हैं तो आपको यह ध्यान रखना होगा कि सभी आवश्यक डेटा एक बार में लोड हो जाते हैं, अन्यथा आपको आलसी प्रारंभिक अपवाद मिलेंगे। लेकिन कई परिस्थितियों में मैं इसे वांछनीय मानता हूं क्योंकि यह आपको कुछ नियंत्रण देता है जब डेटा और लोड किया जाता है, जो अन्यथा जेपीए का उपयोग करते समय आपकी उंगलियों के माध्यम से आसानी से फिसल जाता है।

संशोधनों के लिए मैं एक अलग लेनदेन के दायरे का उपयोग करता हूं जो लोडिंग, बदलने (और स्पष्ट रूप से बने रहने) की पूरी प्रक्रिया को लपेटता है।

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