केन का उत्तर मूल रूप से सही है लेकिन मैं "क्यों आप एक दूसरे पर उपयोग करना चाहते हैं?" आपके सवाल का हिस्सा है।
मूल बातें
आपके भंडार के लिए आपके द्वारा चुने गए आधार इंटरफ़ेस के दो मुख्य उद्देश्य हैं। सबसे पहले, आप स्प्रिंग डेटा रिपॉजिटरी इन्फ्रास्ट्रक्चर को आपके इंटरफ़ेस को खोजने और प्रॉक्सी निर्माण को ट्रिगर करने की अनुमति देते हैं ताकि आप क्लाइंट में इंटरफ़ेस के इंस्टेंस को इंजेक्ट करें। दूसरा उद्देश्य अतिरिक्त तरीकों की घोषणा किए बिना इंटरफ़ेस में आवश्यकतानुसार अधिक कार्यक्षमता खींचना है।
आम इंटरफेस
दो आधार इंटरफेस के साथ स्प्रिंग डेटा कोर लाइब्रेरी शिप्स जो कार्यात्मकताओं के एक समर्पित सेट को उजागर करते हैं:
CrudRepository
- CRUD के तरीके
PagingAndSortingRepository
- अंकुरण और छँटाई के लिए तरीके (फैली हुई CrudRepository
)
स्टोर-विशिष्ट इंटरफेस
व्यक्तिगत स्टोर मॉड्यूल (जैसे JPA या MongoDB) इन स्टोर इंटरफेस की स्टोर-विशिष्ट एक्सटेंशन को उजागर करते हैं, स्टोर-विशिष्ट कार्यक्षमता तक पहुंच प्राप्त करने की अनुमति देते हैं जैसे फ्लशिंग या समर्पित बैचिंग जो कुछ स्टोर की बारीकियों को ध्यान में रखते हैं। इसके लिए एक उदाहरण है deleteInBatch(…)
, JpaRepository
जो इससे भिन्न है delete(…)
क्योंकि यह दिए गए संस्थाओं को हटाने के लिए एक क्वेरी का उपयोग करता है जो अधिक प्रदर्शन योग्य है लेकिन जेपीए-परिभाषित कैस्केड को ट्रिगर नहीं करने के साइड इफेक्ट के साथ आता है (जैसा कि यह कल्पना परिभाषित करता है)।
हम आम तौर पर इन आधार इंटरफेस का उपयोग नहीं करने की सलाह देते हैं क्योंकि वे ग्राहकों को अंतर्निहित दृढ़ता प्रौद्योगिकी को उजागर करते हैं और इस प्रकार उनके और रिपॉजिटरी के बीच युग्मन को कसते हैं। इसके अलावा, आप एक भंडार की मूल परिभाषा से थोड़ा दूर हो जाते हैं जो मूल रूप से "संस्थाओं का एक संग्रह" है। इसलिए यदि आप कर सकते हैं, तो साथ रहेंPagingAndSortingRepository
।
कस्टम रिपॉजिटरी आधार इंटरफेस
सीधे प्रदान किए गए आधार इंटरफेस में से एक के आधार पर नकारात्मक पक्ष दो गुना है। उन दोनों को सैद्धांतिक माना जा सकता है, लेकिन मुझे लगता है कि वे इस बारे में जागरूक होना ज़रूरी हैं:
- एक स्प्रिंग डेटा रिपॉजिटरी इंटरफ़ेस के आधार पर लाइब्रेरी के लिए आपकी रिपॉजिटरी इंटरफ़ेस जोड़े। मुझे नहीं लगता कि यह एक विशेष मुद्दा है जैसा कि आप शायद अमूर्त जैसे
Page
या का उपयोग करेंगेPageable
अपने कोड में भी । स्प्रिंग डेटा किसी भी अन्य सामान्य प्रयोजन पुस्तकालय से अलग नहीं है जैसे कॉमन्स-लैंग या अमरूद। जब तक यह उचित लाभ प्रदान करता है, तब तक यह ठीक है।
- उदाहरण के लिए
CrudRepository
, आप एक बार हठ विधि का एक पूरा सेट उजागर करते हैं। यह संभवत: अधिकांश परिस्थितियों में ठीक है, लेकिन आप उन स्थितियों में भाग सकते हैं, जहां आप उन तरीकों पर अधिक बारीक नियंत्रण हासिल करना चाहते हैं, जैसे बनाने के ReadOnlyRepository
लिए save(…)
और जिसमें delete(…)
विधियों का समावेश नहीं है CrudRepository
।
इन दोनों डाउनसाइड का समाधान अपने स्वयं के आधार भंडार इंटरफेस या यहां तक कि उनमें से एक सेट को तैयार करना है। बहुत सारे अनुप्रयोगों में मैंने ऐसा कुछ देखा है:
interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }
interface ReadOnlyRepository<T> extends Repository<T, Long> {
// Al finder methods go here
}
पहला रिपॉजिटरी इंटरफ़ेस कुछ सामान्य उद्देश्य बेस इंटरफ़ेस है जो वास्तव में केवल बिंदु 1 को ठीक करता है, लेकिन Long
निरंतरता के लिए आईडी प्रकार को भी रखता है । दूसरा इंटरफ़ेस आम तौर पर सभी है find…(…)
तरीकों से नकल CrudRepository
और PagingAndSortingRepository
लेकिन जोड़ तोड़ लोगों का खुलासा नहीं करता। संदर्भ प्रलेखन में उस दृष्टिकोण पर और पढ़ें ।
सारांश - टीएल; डॉ
रिपॉजिटरी एब्स्ट्रेक्शन आपको बेस रिपॉजिटरी को पूरी तरह से वास्तु और कार्यात्मक जरूरतों से संचालित करने की अनुमति देता है। यदि वे सूट करते हैं, तो बॉक्स से बाहर दिए गए लोगों का उपयोग करें, यदि आवश्यक हो तो अपने स्वयं के भंडार आधार इंटरफेस को शिल्प करें। जब तक अपरिहार्य न हो दुकान विशिष्ट भंडार इंटरफेस से दूर रहें।