21

के बारे में उलझन में मुझे डीडीडी रिपोजिटरी पैटर्न के बारे में बहुत कुछ पता नहीं है लेकिन वसंत में कार्यान्वयन मुझे भ्रमित कर रहा है।स्प्रिंग-डेटा डीडीडी रिपोजिटरी पैटर्न

public interface PersonRepository extends JpaRepository<Person, Long> { … } 

इंटरफ़ेस JpaRepository (या MongoDBRepository ...) फैली हुई है, यदि आप एक से दूसरे डाटाबेस से बदलने के लिए, आप इंटरफ़ेस बदलने के लिए भी है।

मेरे लिए एक इंटरफेस कुछ अमूर्त प्रदान करने के लिए नहीं है, लेकिन यहाँ यह इतना सार नहीं है ...

आपको पता है क्यों वसंत-डाटा कि तरह काम करता है?

उत्तर

11

आप सही हैं, एक इंटरफ़ेस किसी बाहरी दृष्टिकोण के बाहर सभी कार्यान्वयन कक्षाओं के बराबर काम करता है जो किसी चीज के बारे में एक अमूर्त है।

और वह यहां वास्तव में क्या होता है:

  • JpaRepository एक आम (सभी विभिन्न संस्थाओं के लिए) अपने सभी जेपीए डेटा संग्रह स्थान को देखते है, जबकि MongoDBRepository सभी MongoDB संस्थाओं के लिए ही है।
  • लेकिन JpaRepository और MongoDBRepository आम में कुछ भी नहीं है, सामान है कि वहाँ आम सुपर इंटरफेस में परिभाषित किया गया है को छोड़कर है:

    • org.springframework.data.repository.PagingAndSortingRepository
    • org.springframework.data.repository .Repository

इसलिए मेरे लिए यह सामान्य लग रहा है।

आप वर्गों है कि उसके बाद अपने भंडार को लागू PagingAndSortingRepository या भंडार का उपयोग करता है, तो आप (खेद है, लेकिन मैं इस तरह के एक उपयोग के मामले कल्पना नहीं कर सकते एक जेपीए कार्यान्वयन से एक दस्तावेज़ आधारित कार्यान्वयन के लिए स्विच करने में सक्षम होना चाहता हूँ का उपयोग करते हैं - वैसे भी)। और निश्चित रूप से आपके रिपोजिटरी कार्यान्वयन को सही इंटरफ़ेस (JpaRepository, MongoDBRepository) को लागू करना चाहिए जो इसके आधार पर है।

+2

असल में यदि आप इंटरफ़ेस में जानते हैं कि एक रिपोजिटरी कार्यान्वयन दिया गया प्रकार है, तो इंटरफ़ेस का उपयोग क्यों करें? लेकिन मुझे लगता है कि आपको बेहतर करना मुश्किल है ... –

+0

मुझे लगता है कि आरडीबीएमएस से एक दस्तावेज़-उन्मुख स्टोर में परिवर्तन ऑब्जेक्ट/डोमेन मॉडल पर महत्वपूर्ण बदलाव की आवश्यकता होगी। कोई फर्क नहीं पड़ता कि, * दृढ़ता abrasctions * एक तरफ या दूसरे में रिसाव। हमेशा। यदि कोई डोमेन मॉडल में बड़े बदलाव किए बिना JpaRepository से MongoDBRepository में बदल सकता है, तो मैं अनुमान लगाता हूं कि डोमेन मॉडल उस जटिल के साथ शुरू नहीं हुआ था।इसके साथ कुछ भी गलत नहीं है क्योंकि कुछ एप्लिकेशन इस तरह हैं। –

7

इसके पीछे तर्क इस ब्लॉग पोस्ट http://blog.springsource.com/2011/02/10/getting-started-with-spring-data-jpa/ में स्पष्ट रूप से स्पष्ट रूप से बताया गया है।

इस इंटरफेस को परिभाषित करना दो उद्देश्यों में कार्य करता है: सबसे पहले, JpaRepository बढ़ा कर हम अपने प्रकार में सामान्य CRUD तरीकों बचत कि अनुमति देता है लेखा, उन्हें हटाने और इतने पर की एक गुच्छा मिलता है। दूसरा, यह स्प्रिंग डेटा जेपीए रिपोजिटरी इंफ्रास्ट्रक्चर को इस इंटरफ़ेस के लिए क्लासपाथ स्कैन करने और इसके लिए स्प्रिंग बीन बनाने की अनुमति देगा।

यदि आप स्रोत के करीब इतने स्रोतों पर विश्वास नहीं करते हैं (पन इरादा) तो इस पोस्ट को पढ़ने के लिए भी एक अच्छा विचार हो सकता है http://www.brucephillips.name/blog/index.cfm/2011/3/25/Using-Spring-Data-JPA-To-Reduced-Data-Access-Coding

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

+1

मुझे कार्यान्वयन की परवाह नहीं है। और यदि भंडार को स्कैन किया जाना है, तो अधिक सामान्य भंडार इंटरफ़ेस क्यों नहीं बढ़ाया जा रहा है? वे बचत और हटाने के बारे में बात करते हैं, मुझे mongoDB के बारे में बहुत कुछ पता नहीं है, लेकिन मुझे लगता है कि हम इन परिचालनों को भी mongoDB पर कर सकते हैं ... यदि आप अपनी सेवाओं में फ्लश जैसी विधियों का पर्दाफाश करते हैं, तो आप उन्हें ऑर्म निर्भर करते हैं? –

2

स्प्रिंग डाटा की M2 जब तक हम निम्न कारणों से JpaRepository विस्तार करने के लिए उपयोगकर्ताओं की आवश्यकता:

  1. classpath स्कैनिंग बुनियादी ढांचे केवल कि इंटरफ़ेस एक का उपयोग हो सकता है के रूप में वसंत डाटा जेपीए और स्प्रिंग डाटा का विस्तार इंटरफेस उठाया मोंगो समानांतर में है और उनमें से दोनों ने एक ही पैकेज को इंगित किया है, यह स्पष्ट नहीं होगा कि किस स्टोर के लिए प्रॉक्सी बनाना है। हालांकि आरसी 1 के बाद से हम बस उस बोझ को डेवलपर को छोड़ देते हैं क्योंकि हमें लगता है कि यह एक विदेशी मामला है और Repository, CrudRepository या केवल वर्णित कोने मामले में आपको जितना प्रयास करना है, उतना ही पसंद है। आप इस नाम पर बेहतर अनाज प्राप्त करने के लिए नामस्थान में exclude और include तत्वों का उपयोग कर सकते हैं।
  2. एम 2 तक हमने सीआरयूडी विधियों को सीआरयूडी विधियों को दोबारा शुरू करके और @Transactional के साथ एनोटेट करके सीआरयूडी विधियों पर लागू किया था। बदले में यह निर्णय लेनदेन कॉन्फ़िगरेशन खोजने के लिए एल्गोरिदम AnnotationTransactionAttributeSource उपयोग द्वारा संचालित किया गया था। चूंकि हम कंक्रीट रिपोजिटरी इंटरफ़ेस में सीआरयूडी विधि को फिर से शुरू करके और @Transactional पर लागू करके लेन-देन को पुन: कॉन्फ़िगर करने की संभावना के साथ उपयोगकर्ता को प्रदान करना चाहते थे। आरसी 1 के लिए हमने एनोटेशन को वापस भंडार सीआरयूडी कार्यान्वयन में स्थानांतरित करने में सक्षम होने के लिए एक कस्टम TransactionAttributeSource लागू करने का निर्णय लिया।

लंबी कहानी संक्षेप में, यहाँ क्या यह करने पर निर्भर करता है:

RC1 के रूप में वहाँ आप करना चाहते हैं ...

  1. उपयोग को छोड़कर दुकान विशिष्ट भंडार इंटरफेस अब और विस्तार करने के लिए आवश्यकता नहीं है, List पर Iterable के बजाय 0 कोरके आधार पर अधिक कोर रिपोजिटरी इंटरफेस में आधारित है (हालांकि आपलौटने के लिए सामान्य आधार इंटरफ़ेस में प्रासंगिक विधियों को फिर से शुरू कर सकते हैं 0 एस के साथ-साथ)
  2. आप जेपीए-विशिष्ट विधियों जैसे saveAndFlush(…) आदि का उपयोग करना चाहते हैं।

आम तौर पर आप के रूप में आप भी केवल Repository मार्कर इंटरफ़ेस का विस्तार और चुनिंदा CRUD तरीकों आप को बेनकाब करना चाहते हैं जोड़ सकते हैं और अधिक RC1 के बाद से CRUD तरीकों में से जोखिम के बारे में लचीले होते हैं। के रूप में समर्थन कार्यान्वयन अभी भी PagingAndSortingRepository के तरीके के सभी लागू करेगा हम अभी भी मार्ग उदाहरण के लिए कॉल कर सकते हैं:

public interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> { 

    List<T> findAll(); 

    T findOne(ID id); 
} 

public interface UserRepository extends MyBaseRepository<User, Long> { 

    List<T> findByUsername(String username); 
} 

कि उदाहरण में हम केवल करने के लिए MyBaseRepository परिभाषित बेनकाब findAll() और findOne(…) (जो उदाहरण में कराई जाएगी सीआरयूडी विधियों को कार्यान्वित करना) और कंक्रीट रिपोजिटरी दो सीआरयूडी के लिए एक खोजक विधि जोड़ना।

उस विषय पर अधिक जानकारी के लिए कृपया reference documentation से परामर्श लें।

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