स्प्रिंग डेटा JPA में CrudRepository और JpaRepository के बीच अंतर क्या है?


706

स्प्रिंग डेटा JPA में CrudRepository और JpaRepository के बीच अंतर क्या है ?

जब मैं वेब पर उदाहरणों को देखता हूं, तो मैं देखता हूं कि उन्होंने वहां किस तरह के इंटरचेंज का इस्तेमाल किया है।

उनके बीच क्या अंतर है?

आप एक से दूसरे का उपयोग क्यों करना चाहेंगे?


जवाबों:


956

JpaRepositoryPagingAndSortingRepositoryजो विस्तार में विस्तार करता हैCrudRepository

उनके मुख्य कार्य हैं:

  • CrudRepository मुख्य रूप से CRUD फ़ंक्शन प्रदान करता है।
  • PagingAndSortingRepository अभिलेख बनाने और छँटाई करने के तरीके प्रदान करता है।
  • JpaRepository जेपीए से संबंधित कुछ विधियाँ प्रदान करता है जैसे कि दृढ़ता के संदर्भ को प्रवाहित करना और एक बैच में रिकॉर्ड को हटाना।

क्योंकि विरासत का ऊपर उल्लेख किया है, JpaRepositoryके सभी कार्यों को करना होगा CrudRepositoryऔर PagingAndSortingRepository। इसलिए यदि आपको रिपॉजिटरी की जरूरत नहीं है, तो उपलब्ध कराए गए कार्यों का उपयोग करें JpaRepositoryऔर PagingAndSortingRepositoryउपयोग करें CrudRepository


143
और एक सूची लौटाता है <> Iterable के बजाय <> findAll में () :-)
हिनोटी

397

केन का उत्तर मूल रूप से सही है लेकिन मैं "क्यों आप एक दूसरे पर उपयोग करना चाहते हैं?" आपके सवाल का हिस्सा है।

मूल बातें

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

आम इंटरफेस

दो आधार इंटरफेस के साथ स्प्रिंग डेटा कोर लाइब्रेरी शिप्स जो कार्यात्मकताओं के एक समर्पित सेट को उजागर करते हैं:

  • CrudRepository - CRUD के तरीके
  • PagingAndSortingRepository- अंकुरण और छँटाई के लिए तरीके (फैली हुई CrudRepository)

स्टोर-विशिष्ट इंटरफेस

व्यक्तिगत स्टोर मॉड्यूल (जैसे JPA या MongoDB) इन स्टोर इंटरफेस की स्टोर-विशिष्ट एक्सटेंशन को उजागर करते हैं, स्टोर-विशिष्ट कार्यक्षमता तक पहुंच प्राप्त करने की अनुमति देते हैं जैसे फ्लशिंग या समर्पित बैचिंग जो कुछ स्टोर की बारीकियों को ध्यान में रखते हैं। इसके लिए एक उदाहरण है deleteInBatch(…), JpaRepositoryजो इससे भिन्न है delete(…)क्योंकि यह दिए गए संस्थाओं को हटाने के लिए एक क्वेरी का उपयोग करता है जो अधिक प्रदर्शन योग्य है लेकिन जेपीए-परिभाषित कैस्केड को ट्रिगर नहीं करने के साइड इफेक्ट के साथ आता है (जैसा कि यह कल्पना परिभाषित करता है)।

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

कस्टम रिपॉजिटरी आधार इंटरफेस

सीधे प्रदान किए गए आधार इंटरफेस में से एक के आधार पर नकारात्मक पक्ष दो गुना है। उन दोनों को सैद्धांतिक माना जा सकता है, लेकिन मुझे लगता है कि वे इस बारे में जागरूक होना ज़रूरी हैं:

  1. एक स्प्रिंग डेटा रिपॉजिटरी इंटरफ़ेस के आधार पर लाइब्रेरी के लिए आपकी रिपॉजिटरी इंटरफ़ेस जोड़े। मुझे नहीं लगता कि यह एक विशेष मुद्दा है जैसा कि आप शायद अमूर्त जैसे Pageया का उपयोग करेंगेPageable अपने कोड में भी । स्प्रिंग डेटा किसी भी अन्य सामान्य प्रयोजन पुस्तकालय से अलग नहीं है जैसे कॉमन्स-लैंग या अमरूद। जब तक यह उचित लाभ प्रदान करता है, तब तक यह ठीक है।
  2. उदाहरण के लिए 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लेकिन जोड़ तोड़ लोगों का खुलासा नहीं करता। संदर्भ प्रलेखन में उस दृष्टिकोण पर और पढ़ें ।

सारांश - टीएल; डॉ

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


84

यहाँ छवि विवरण दर्ज करें

सारांश:

  • PagingAndSortingRepository CrudRepository का विस्तार करता है

  • JpaRepository PagingAndSortingRepository का विस्तार करता है

क्रूडरिपोसेरी इंटरफ़ेस तो यह आप अपने खुद के तरीकों को परिभाषित करने के बिना बनाने, पढ़ने, अद्यतन और हटाना रिकॉर्ड करने की अनुमति देता, CRUD संचालन के लिए तरीके प्रदान करता है।

PagingAndSortingRepository पृष्ठांकन का उपयोग करने और छँटाई संस्थाओं को पुनः प्राप्त करने में अतिरिक्त पद्धतियां प्रदान करता है।

अंत में JpaRepository कुछ और कार्यक्षमता जोड़ता है जो JPA के लिए विशिष्ट है।


"रिपॉजिटरी <>" का विस्तार क्या है? इसके कौन से तरीके होंगे? CrudRepository के रूप में भी?
s-kaczmarek

16

मैं स्प्रिंग डेटा जेपीए सीख रहा हूं। यह आपकी मदद कर सकता है: यहाँ छवि विवरण दर्ज करें


3

सभी उत्तर प्रश्न के लिए पर्याप्त विवरण प्रदान करते हैं। हालाँकि, मुझे कुछ और जोड़ने दें।

हम इन इंटरफेस का उपयोग क्यों कर रहे हैं:

  • वे स्प्रिंग को आपके रिपॉजिटरी इंटरफेस को खोजने और उनके लिए प्रॉक्सी ऑब्जेक्ट बनाने की अनुमति देते हैं।
  • यह आपको ऐसे तरीके प्रदान करता है जो आपको कुछ सामान्य ऑपरेशन करने की अनुमति देते हैं (आप अपने कस्टम तरीके को भी परिभाषित कर सकते हैं)। मुझे यह सुविधा पसंद है क्योंकि एक विधि बनाना (और क्वेरी और तैयार किए गए कथनों को परिभाषित करना और फिर कनेक्शन ऑब्जेक्ट के साथ क्वेरी को निष्पादित करना) एक सरल ऑपरेशन करना वास्तव में बेकार है!

कौन सा इंटरफ़ेस क्या करता है:

  • CrudRepository : CRUD फ़ंक्शन प्रदान करता है
  • PagingAndSortingRepository : पेजिंग करने और रिकॉर्ड को सॉर्ट करने के तरीके प्रदान करता है
  • JpaRepository : JPA से संबंधित विधियाँ प्रदान करता है जैसे दृढ़ता के संदर्भ को प्रवाहित करना और एक बैच में रिकॉर्ड को हटाना

कब किस इंटरफ़ेस का उपयोग करें:

Http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/ के अनुसार

आम तौर पर सबसे अच्छा विचार यह है कि आपको क्रूडरैपोसिटरी या पेजिंग का उपयोग करना है या नहीं, इस पर निर्भर करते हुए कि आपको सॉर्टिंग और पेजिंग की आवश्यकता है या नहीं।

JpaRepository यदि संभव हो तो बचा जाना चाहिए क्योंकि यह बांध आप जेपीए हठ प्रौद्योगिकी के लिए डेटा संग्रह स्थानों, और ज्यादातर मामलों में आप शायद भी यह द्वारा प्रदान की अतिरिक्त तरीकों का उपयोग नहीं होता।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.