हाइबरनेट और स्प्रिंग डेटा जेपीए के बीच अंतर क्या है


207

हाइबरनेट और स्प्रिंग डेटा जेपीए के बीच मुख्य अंतर क्या हैं? हमें हाइबरनेट या स्प्रिंग डेटा जेपीए का उपयोग कब नहीं करना चाहिए? इसके अलावा, जब स्प्रिंग JDBC टेम्पलेट हाइबरनेट / स्प्रिंग डेटा JPA से बेहतर प्रदर्शन कर सकता है?


7
@NeilStockton दो तकनीकों के बीच तुलना के लिए पूछ रहा है राय के लिए पूछ नहीं है।
फिलिप रीगो

जवाबों:


262

हाइबरनेट एक जेपीए कार्यान्वयन है, जबकि स्प्रिंग डेटा जेपीए एक जेपीए डेटा अभिगम है। स्प्रिंग डेटा JPA एक JPA प्रदाता के बिना काम नहीं कर सकता।

स्प्रिंग डेटा डीडीडी Repositoryपैटर्न या विरासत GenericDaoकस्टम कार्यान्वयन का एक समाधान प्रदान करता है । यह विधि नाम सम्मेलनों के माध्यम से आपकी ओर से जेपीए प्रश्न भी उत्पन्न कर सकता है।

स्प्रिंग डेटा के साथ, आप हाइबरनेट, ग्रहण लिंक या किसी अन्य जेपीए प्रदाता का उपयोग कर सकते हैं। स्प्रिंग या जावा ईई का उपयोग करने का एक बहुत ही दिलचस्प लाभ यह है कि आप @Transactionalएनोटेशन का उपयोग करके लेन-देन की सीमाओं को घोषित रूप से नियंत्रित कर सकते हैं

स्प्रिंग JDBC अधिक हल्का है, और यह देशी क्वेरी के लिए अभिप्रेत है, और यदि आप केवल JDBC का अकेले उपयोग करने का इरादा रखते हैं, तो आप JDBC वर्बोसिटी से निपटने के लिए स्प्रिंग JDBC का उपयोग करना बेहतर समझते हैं।

इसलिए, हाइबरनेट और स्प्रिंग डेटा प्रतियोगियों के बजाय पूरक हैं।


52
तो क्या इसका मतलब यह है कि स्प्रिंग डेटा JPA स्वयं मौजूद नहीं हो सकता है? अर्थात्, हुड के तहत, यह जेपीए प्रदाता (जैसे हाइबरनेट, एक्लिप्सलिंक या किसी अन्य जेपीए प्रदाता) में से एक का उपयोग करता है?
जिज्ञासु

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

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

138

यहाँ हम उपयोग कर रहे हैं 3 अलग अलग चीजें हैं:

  1. जेपीए: जावा दृढ़ता एपि जो डेटाबेस में संबंधों के लिए आपके जावा ऑब्जेक्ट से डेटा को बनाए रखने, पढ़ने, प्रबंधन करने के लिए विनिर्देश प्रदान करता है।
  2. हाइबरनेट: विभिन्न प्रदाता हैं जो जेपा को लागू करते हैं। हाइबरनेट उनमें से एक है। इसलिए हमारे पास अन्य प्रदाता भी हैं। लेकिन अगर वसंत के साथ जपा का उपयोग करते हुए यह आपको भविष्य में विभिन्न प्रदाताओं में स्विच करने की अनुमति देता है।
  3. स्प्रिंग डेटा जेपीए: जेपा के ऊपर यह एक और परत है जो वसंत आपके जीवन को आसान बनाने के लिए प्रदान करता है।

तो आइए समझते हैं कि स्प्रिंग डेटा जपा और स्प्रिंग + हाइबरनेट कैसे काम करता है-


स्प्रिंग डेटा JPA:

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

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


3
तो स्प्रिंग डेटा JPA अंतर्निहित कार्यान्वयन क्या है, क्या यह हाइबरनेट है i क्योंकि जब मैं PagingAndSortingRepository का उपयोग करता हूं, तो यह कंसोल में हाइबरनेट लॉग दिखाता है।
विक्की

2
स्प्रिंग डेटा जेपीए ने डिफ़ॉल्ट रूप से हाइबरनेट कार्यान्वयन का उपयोग किया था .. यदि आप स्प्रिंग-बूट-स्टार्टर-डेटा-
जेपीए की सकरात्मक निर्भरता

28

मैं स्प्रिंग जेपीए से असहमत हूं। हां, यह कुछ कक्षाएं प्रदान करता है और आप कुछ सरल डीएओ तेज कर सकते हैं, लेकिन वास्तव में, यह सब आप कर सकते हैं। यदि आप findById () या बचत से अधिक कुछ करना चाहते हैं, तो आपको नरक से गुजरना होगा:

  • org.springframework.data.repository classes में कोई EntityManager पहुंच नहीं है (यह मूल JPA वर्ग है!)
  • स्वयं के लेन-देन प्रबंधन (हाइबरनेट लेनदेन अस्वीकृत)
  • एक से अधिक डेटा स्रोत कॉन्फ़िगरेशन के साथ भारी समस्याएं
  • कोई डेटा स्रोत पूलिंग (HikariCP तीसरे पक्ष के पुस्तकालय के रूप में उपयोग में होना चाहिए)

खुद का लेनदेन प्रबंधन एक नुकसान क्यों है? चूंकि Java 1.8 डिफ़ॉल्ट तरीकों को इंटरफेस में अनुमति देता है, स्प्रिंग एनोटेशन आधारित लेनदेन, सरल काम नहीं करता है।

दुर्भाग्य से, स्प्रिंगजेपीए प्रतिबिंबों पर आधारित है, और कभी-कभी आपको एनोटेशन (!) में विधि नाम या इकाई पैकेज को इंगित करने की आवश्यकता होती है। इसीलिए कोई भी रिफलेक्टिंग बड़ी दुर्घटना बनाती है। अफसोस की बात है, केवल प्राथमिक डीएस के लिए @ ट्रेंसेक्शनल काम करता है :( इसलिए, यदि आपके पास एक से अधिक डेटा स्रोत हैं, तो याद रखें - लेनदेन केवल प्राथमिक एक के लिए काम करता है :)

हाइबरनेट और स्प्रिंग डेटा जेपीए के बीच मुख्य अंतर क्या हैं?

हाइबरनेट जेपीए कॉम्पिटिबाइल, स्प्रिंगजेपीए स्प्रिंग कॉम्पेटिबल है। अपने हाइबरनेटजेपीए डीएओ का उपयोग जावाईई या हाइबरनेट स्टैंडअलोन के साथ किया जा सकता है, जब स्प्रिंगजेपीए का उपयोग स्प्रिंग के भीतर किया जा सकता है - उदाहरण के लिए स्प्रिंगबूट

हमें हाइबरनेट या स्प्रिंग डेटा जेपीए का उपयोग कब नहीं करना चाहिए? इसके अलावा, जब स्प्रिंग JDBC टेम्पलेट हाइबरनेट / स्प्रिंग डेटा JPA से बेहतर प्रदर्शन कर सकता है?

स्प्रिंग JDBC का उपयोग केवल तभी करें जब आपको बहुत जॉइन का उपयोग करने की आवश्यकता हो या जब आपको स्प्रिंग का उपयोग करने के लिए कई डेटा स्रोत कनेक्शन की आवश्यकता हो। आमतौर पर, जॉपीए फॉर जॉइन से बचें।

लेकिन मेरी सामान्य सलाह, ताज़े घोल का उपयोग करें- दाओबाब ( http://www.daobab.io )। Daobab मेरा जावा और कोई JPA इंजन इंटीग्रेटर है, और मुझे विश्वास है कि यह आपके कार्यों में बहुत मदद करेगा :)


2
दोआब, सचमुच? यदि आपको jpql के प्रकार की सुरक्षा पसंद नहीं है (I don’t), JPA के पास एक प्रकार का सुरक्षित मानदंड API है ... मानक JPA उस खराब विकल्प से बेहतर है।
यमजोरोस

8

Spring DataJPAउस सार के शीर्ष पर एक सुविधा पुस्तकालय है जो कई चीजों को दूर करता है और दृढ़ता स्टोर एक्सेस तक स्प्रिंग जादू (जैसे या नहीं) लाता है। यह मुख्य रूप से रिलेशनल डेटाबेस के साथ काम करने के लिए उपयोग किया जाता है। संक्षेप में, यह आपको उन इंटरफेस की घोषणा करने की अनुमति देता है, जिनके पास तरीके हैं findByNameOrderByAge(String name);जो रनटाइम में पार्स किए जाएंगे और उपयुक्त JPAप्रश्नों में परिवर्तित हो जाएंगे ।

इसका स्थान JPAइसके उपयोग के लिए आकर्षक बनाता है:

  1. धोखेबाज़ डेवलपर्स जो नहीं जानते हैं SQL इसे बुरी तरह से या जानते हैं। यह आपदा के लिए एक नुस्खा है, लेकिन अगर परियोजना तुच्छ है तो वे इससे दूर हो सकते हैं।

  2. अनुभवी इंजीनियर जो जानते हैं कि वे क्या करते हैं और चीजों को तेजी से फैलाना चाहते हैं। यह एक व्यवहार्य रणनीति हो सकती है (लेकिन आगे पढ़ें)।

मेरे अनुभव के साथ Spring Data, इसका जादू बहुत अधिक है (यह Springसामान्य रूप से लागू होता है )। मैंने इसे एक परियोजना में भारी उपयोग करना शुरू कर दिया और अंततः कई कोने के मामलों को हिट किया, जहां मैं पुस्तकालय को अपने रास्ते से बाहर नहीं कर सका और बदसूरत वर्कअराउंड के साथ समाप्त हो गया। बाद में मैंने अन्य उपयोगकर्ताओं की शिकायतों को पढ़ा और महसूस किया कि ये मुद्दे विशिष्ट हैं Spring Data। उदाहरण के लिए, इस समस्या की जाँच करें जिसके कारण जाँच / शपथ ग्रहण का समय था:

 public TourAccommodationRate createTourAccommodationRate(
        @RequestBody TourAccommodationRate tourAccommodationRate
    ) {
        if (tourAccommodationRate.getId() != null) {
            throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
        }

        // This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
        // when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
        // information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
        // code creating the corresponding slim model. By detaching the entity from the persistence context we
        // force the ORM to re-fetch it from the database instead of taking it from the cache

        tourAccommodationRateRepository.save(tourAccommodationRate);
        entityManager.detach(tourAccommodationRate);
        return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
    }

मैंने निचले स्तर पर जाना समाप्त कर दिया और JDBIआपको बॉयलरप्लेट से बचाने के लिए सिर्फ "जादू" के साथ एक अच्छी लाइब्रेरी का उपयोग करना शुरू कर दिया । इसके साथ, आपके पास SQL ​​प्रश्नों पर पूरा नियंत्रण है और लगभग कभी भी लाइब्रेरी से लड़ने के लिए नहीं है।


यह एक अच्छा जवाब है लेकिन अगर आप कोने के मामलों को सूचीबद्ध कर सकते हैं और इसे और विस्तृत कर सकते हैं तो यह बहुत मददगार होगा। यह एक महान जवाब बन जाएगा। धन्यवाद
जॉन

ठीक है, उन लोगों को याद करना आसान नहीं है, जो मैंने स्प्रिंग डेटा के साथ काफी समय तक काम नहीं किए हैं - मुझे पुराने कोड पर जाना होगा और अधिक टिप्पणियां जोड़नी होंगी। हालांकि, मेरे सिर से सीधे झुंझलाहट में से एक - जेपीए में अक्सर वस्तुओं को एक दूसरे को संदर्भित करना पड़ता है (जैसे कैस्केडिंग संचालन के लिए)। यह एक स्टैक ओवरफ्लो त्रुटि (परिपत्र संदर्भों के कारण) का कारण बनता है जब स्प्रिंग उन्हें बदसूरत fiddling / वर्कअराउंड में मजबूर करने की कोशिश करता है। यह समस्या स्प्रिंग डेटा के लिए स्पर्शनीय है, क्योंकि यह एक जेपीए मुद्दा है। हालाँकि, चूंकि जेपीए स्प्रिंग डेटा अंतर्निहित है, इसलिए आप इसे "मुफ्त में" प्राप्त करते हैं।
raiks

पोस्ट को संपादित किया और एक और उदाहरण जोड़ा।
raiks

1

हाइबरनेट "जेपीए" का कार्यान्वयन है जो डेटाबेस में जावा ऑब्जेक्ट के लिए एक विनिर्देश है।

मैं wrt JPA का उपयोग करने की सलाह दूंगा क्योंकि आप विभिन्न ORMS के बीच स्विच कर सकते हैं।

जब आप JDBC का उपयोग करते हैं तो आपको SQL क्वेरी का उपयोग करने की आवश्यकता होती है, इसलिए यदि आप SQL में कुशल हैं तो JDBC के लिए जाएं।


1

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

जेपीए में सीखने की वक्र की अच्छी मात्रा और कभी-कभी मुद्दों को डीबग करना मुश्किल होता है। दूसरी ओर, जब आपके पास SQL ​​पर पूर्ण नियंत्रण होता है, तो क्वेरी को अनुकूलित करना और प्रदर्शन में सुधार करना बहुत आसान हो जाता है। आप अपनी SQL को DBA या किसी ऐसे व्यक्ति के साथ आसानी से साझा कर सकते हैं, जिसे डेटाबेस की बेहतर समझ है।

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