हाइबरनेट और स्प्रिंग डेटा जेपीए के बीच मुख्य अंतर क्या हैं? हमें हाइबरनेट या स्प्रिंग डेटा जेपीए का उपयोग कब नहीं करना चाहिए? इसके अलावा, जब स्प्रिंग JDBC टेम्पलेट हाइबरनेट / स्प्रिंग डेटा JPA से बेहतर प्रदर्शन कर सकता है?
हाइबरनेट और स्प्रिंग डेटा जेपीए के बीच मुख्य अंतर क्या हैं? हमें हाइबरनेट या स्प्रिंग डेटा जेपीए का उपयोग कब नहीं करना चाहिए? इसके अलावा, जब स्प्रिंग JDBC टेम्पलेट हाइबरनेट / स्प्रिंग डेटा JPA से बेहतर प्रदर्शन कर सकता है?
जवाबों:
हाइबरनेट एक जेपीए कार्यान्वयन है, जबकि स्प्रिंग डेटा जेपीए एक जेपीए डेटा अभिगम है। स्प्रिंग डेटा JPA एक JPA प्रदाता के बिना काम नहीं कर सकता।
स्प्रिंग डेटा डीडीडी Repository
पैटर्न या विरासत GenericDao
कस्टम कार्यान्वयन का एक समाधान प्रदान करता है । यह विधि नाम सम्मेलनों के माध्यम से आपकी ओर से जेपीए प्रश्न भी उत्पन्न कर सकता है।
स्प्रिंग डेटा के साथ, आप हाइबरनेट, ग्रहण लिंक या किसी अन्य जेपीए प्रदाता का उपयोग कर सकते हैं। स्प्रिंग या जावा ईई का उपयोग करने का एक बहुत ही दिलचस्प लाभ यह है कि आप @Transactional
एनोटेशन का उपयोग करके लेन-देन की सीमाओं को घोषित रूप से नियंत्रित कर सकते हैं ।
स्प्रिंग JDBC अधिक हल्का है, और यह देशी क्वेरी के लिए अभिप्रेत है, और यदि आप केवल JDBC का अकेले उपयोग करने का इरादा रखते हैं, तो आप JDBC वर्बोसिटी से निपटने के लिए स्प्रिंग JDBC का उपयोग करना बेहतर समझते हैं।
इसलिए, हाइबरनेट और स्प्रिंग डेटा प्रतियोगियों के बजाय पूरक हैं।
यहाँ हम उपयोग कर रहे हैं 3 अलग अलग चीजें हैं:
तो आइए समझते हैं कि स्प्रिंग डेटा जपा और स्प्रिंग + हाइबरनेट कैसे काम करता है-
मान लीजिए कि आप अपने आवेदन के लिए स्प्रिंग + हाइबरनेट का उपयोग कर रहे हैं। अब आपको डैओ इंटरफ़ेस और कार्यान्वयन की आवश्यकता है जहां आप हाइबरनेट के सत्रफैक्टिंग का उपयोग करके क्रूड ऑपरेशन लिखेंगे। मान लीजिए कि आप कर्मचारी वर्ग के लिए डाओ क्लास लिख रहे हैं, कल आपके आवेदन में आपको किसी अन्य संस्था के लिए सिम्यूड क्रूड ऑपरेशन लिखने की आवश्यकता हो सकती है। इसलिए बहुत सारे बॉयलरप्लेट कोड हैं जिन्हें हम यहां देख सकते हैं।
अब स्प्रिंग डेटा जपा हमें अपनी रिपॉजिटरी (क्रूडपोज़िटरी, जिपरपोज़िटरी) को बढ़ाकर डाओ इंटरफेस को परिभाषित करने की अनुमति देता है, ताकि यह आपको रनटाइम पर डाओ कार्यान्वयन प्रदान करे। अब आपको डाओ कार्यान्वयन को लिखने की आवश्यकता नहीं है। यह पता चलता है कि वसंत डेटा कैसे आपके जीवन को आसान बनाता है।
मैं स्प्रिंग जेपीए से असहमत हूं। हां, यह कुछ कक्षाएं प्रदान करता है और आप कुछ सरल डीएओ तेज कर सकते हैं, लेकिन वास्तव में, यह सब आप कर सकते हैं। यदि आप findById () या बचत से अधिक कुछ करना चाहते हैं, तो आपको नरक से गुजरना होगा:
खुद का लेनदेन प्रबंधन एक नुकसान क्यों है? चूंकि Java 1.8 डिफ़ॉल्ट तरीकों को इंटरफेस में अनुमति देता है, स्प्रिंग एनोटेशन आधारित लेनदेन, सरल काम नहीं करता है।
दुर्भाग्य से, स्प्रिंगजेपीए प्रतिबिंबों पर आधारित है, और कभी-कभी आपको एनोटेशन (!) में विधि नाम या इकाई पैकेज को इंगित करने की आवश्यकता होती है। इसीलिए कोई भी रिफलेक्टिंग बड़ी दुर्घटना बनाती है। अफसोस की बात है, केवल प्राथमिक डीएस के लिए @ ट्रेंसेक्शनल काम करता है :( इसलिए, यदि आपके पास एक से अधिक डेटा स्रोत हैं, तो याद रखें - लेनदेन केवल प्राथमिक एक के लिए काम करता है :)
हाइबरनेट और स्प्रिंग डेटा जेपीए के बीच मुख्य अंतर क्या हैं?
हाइबरनेट जेपीए कॉम्पिटिबाइल, स्प्रिंगजेपीए स्प्रिंग कॉम्पेटिबल है। अपने हाइबरनेटजेपीए डीएओ का उपयोग जावाईई या हाइबरनेट स्टैंडअलोन के साथ किया जा सकता है, जब स्प्रिंगजेपीए का उपयोग स्प्रिंग के भीतर किया जा सकता है - उदाहरण के लिए स्प्रिंगबूट
हमें हाइबरनेट या स्प्रिंग डेटा जेपीए का उपयोग कब नहीं करना चाहिए? इसके अलावा, जब स्प्रिंग JDBC टेम्पलेट हाइबरनेट / स्प्रिंग डेटा JPA से बेहतर प्रदर्शन कर सकता है?
स्प्रिंग JDBC का उपयोग केवल तभी करें जब आपको बहुत जॉइन का उपयोग करने की आवश्यकता हो या जब आपको स्प्रिंग का उपयोग करने के लिए कई डेटा स्रोत कनेक्शन की आवश्यकता हो। आमतौर पर, जॉपीए फॉर जॉइन से बचें।
लेकिन मेरी सामान्य सलाह, ताज़े घोल का उपयोग करें- दाओबाब ( http://www.daobab.io )। Daobab मेरा जावा और कोई JPA इंजन इंटीग्रेटर है, और मुझे विश्वास है कि यह आपके कार्यों में बहुत मदद करेगा :)
Spring Data
JPA
उस सार के शीर्ष पर एक सुविधा पुस्तकालय है जो कई चीजों को दूर करता है और दृढ़ता स्टोर एक्सेस तक स्प्रिंग जादू (जैसे या नहीं) लाता है। यह मुख्य रूप से रिलेशनल डेटाबेस के साथ काम करने के लिए उपयोग किया जाता है। संक्षेप में, यह आपको उन इंटरफेस की घोषणा करने की अनुमति देता है, जिनके पास तरीके हैं findByNameOrderByAge(String name);
जो रनटाइम में पार्स किए जाएंगे और उपयुक्त JPA
प्रश्नों में परिवर्तित हो जाएंगे ।
इसका स्थान JPA
इसके उपयोग के लिए आकर्षक बनाता है:
धोखेबाज़ डेवलपर्स जो नहीं जानते हैं SQL
इसे बुरी तरह से या जानते हैं। यह आपदा के लिए एक नुस्खा है, लेकिन अगर परियोजना तुच्छ है तो वे इससे दूर हो सकते हैं।
अनुभवी इंजीनियर जो जानते हैं कि वे क्या करते हैं और चीजों को तेजी से फैलाना चाहते हैं। यह एक व्यवहार्य रणनीति हो सकती है (लेकिन आगे पढ़ें)।
मेरे अनुभव के साथ 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 प्रश्नों पर पूरा नियंत्रण है और लगभग कभी भी लाइब्रेरी से लड़ने के लिए नहीं है।
हाइबरनेट "जेपीए" का कार्यान्वयन है जो डेटाबेस में जावा ऑब्जेक्ट के लिए एक विनिर्देश है।
मैं wrt JPA का उपयोग करने की सलाह दूंगा क्योंकि आप विभिन्न ORMS के बीच स्विच कर सकते हैं।
जब आप JDBC का उपयोग करते हैं तो आपको SQL क्वेरी का उपयोग करने की आवश्यकता होती है, इसलिए यदि आप SQL में कुशल हैं तो JDBC के लिए जाएं।
यदि आप एसक्यूएल प्रश्नों पर सादगी और अधिक नियंत्रण पसंद करते हैं, तो मैं स्प्रिंग डेटा / स्प्रिंग जेडडीबीसी के साथ जाने का सुझाव दूंगा।
जेपीए में सीखने की वक्र की अच्छी मात्रा और कभी-कभी मुद्दों को डीबग करना मुश्किल होता है। दूसरी ओर, जब आपके पास SQL पर पूर्ण नियंत्रण होता है, तो क्वेरी को अनुकूलित करना और प्रदर्शन में सुधार करना बहुत आसान हो जाता है। आप अपनी SQL को DBA या किसी ऐसे व्यक्ति के साथ आसानी से साझा कर सकते हैं, जिसे डेटाबेस की बेहतर समझ है।