हाइबरनेट बनाम iBATIS [बंद]


80

हमारे नए उत्पाद री-इंजीनियरिंग के लिए, हम जावा से सर्वश्रेष्ठ रूपरेखा का चयन करने की प्रक्रिया में हैं। जैसा कि विचार मॉडल के लिए डेटाबेस अज्ञेयवादी दृष्टिकोण के लिए जाना है, हम स्ट्रेट्स + स्प्रिंग के बीच iBATIS या हाइबरनेट के बीच विकल्पों पर काम कर रहे हैं। कृपया सलाह दें जो दोनों दृढ़ता की पेशकश के रूप में सबसे अच्छा है।

जवाबों:


192

iBATIS और हाइबरनेट काफी अलग जानवर हैं।

जिस तरह से मैं इसे देखता हूं वह यह है: हाइबरनेट बेहतर काम करता है अगर आपका दृष्टिकोण अधिक वस्तु केंद्रित है । यदि आप देखते हैं कि अधिक डेटाबेस-केंद्रित है तो iBATIS एक अधिक मजबूत विकल्प है।

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

यदि आप एक "विरासत" डेटाबेस स्कीमा के साथ काम कर रहे हैं, जहां आपको काफी जटिल एसक्यूएल प्रश्नों को लिखने की जरूरत है, तो संभावना है कि iBATIS बेहतर काम करेंगे।

HQL (हाइबरनेट क्वेरी भाषा) एक और भाषा है जिसे आपको सीखना होगा और तब भी आपको शायद ऐसे मामले मिलेंगे जहाँ आपको अभी भी SQL लिखने की आवश्यकता है। क्या अधिक है, संभावना है कि आप एक प्रदर्शनकारी SQL क्वेरी उत्पन्न करने के लिए Hibernate प्राप्त करने के लिए XML, प्रॉपर्टीज़, एनोटेशन आदि के सही संयोजन का पता लगाने में आधे दिन खर्च करेंगे।

इस प्रश्न के लिए कोई सार्वभौमिक "ए बी से बेहतर है" उत्तर नहीं है।


SQL बिल्डर चेक MentaBean के साथ एक हल्के और छोटे ORM के लिए: mentabean.soliveirajr.com
TraderJoeChicago

20
अब 2 साल बाद, यह अभी भी jpa के आगमन के साथ सच है, हाइबरनेट में काफी बदलाव आया है और ibatis अब mybatis है, im सोच रहा है कि लोगों के वर्तमान विचार क्या हैं।
जोएलियो

लेकिन नए वेबप्लिकेशन विकास के लिए JPA2.0 अनुरूप JPA प्रदाता जैसे हाइबरनेट, एक्लिप्सलिंक, टॉपलिंक आदि पर विचार करना अच्छा है। जैसा कि क्लेटस ने बताया कि आईबैटिस भी अच्छा है।
श्री राम

2
आप mybatis के साथ अधिक स्पष्ट नियंत्रण रखते हैं, इस प्रकार अधिक गंदे काम करते हैं। लेकिन मैं व्यक्तिगत रूप से mybatis पसंद करता हूं।
user218867

@ क्लेटस क्या यह अभी भी सच है?
सुगन्थन माधवन पिल्लई

52

गौर कीजिए कि आप क्या हासिल करने की कोशिश कर रहे हैं। आमतौर पर, कमांड क्वेरी प्रतिसाद अलगाव मॉडल जटिल डोमेन के लिए अच्छा काम करता है।

कारण यह है कि आप आम तौर पर दो चीजों में से एक करने की कोशिश कर रहे हैं:

  1. कुछ जटिल डोमेन इकाइयां बनाएं / अपडेट करें / हटाएं
  2. एनालिसिस लाने के लिए क्वेरी (यानी समन / एकत्रीकरण क्वेरी)

हाइबरनेट केस 1 के लिए अच्छी तरह से काम करता है जिससे आप केवल एक पीओजेओ बना सकते हैं और इसे जारी रख सकते हैं / अपडेट कर सकते हैं। यह भी जल्दी से करता है, जब तक कि आपका डोमेन काफी बड़ा न हो।

myBatis लाने के लिए बहुत अच्छा है (प्रश्न 2) जहां आप सिर्फ एक जवाब चाहते हैं। हाइबरनेट पूरे ऑब्जेक्ट ग्राफ को लोड करने का प्रयास करेगा और आपको एक बड़े डोमेन पर काम करने के लिए LazyLading ट्रिक्स के साथ ट्यूनिंग क्वेरी शुरू करने की आवश्यकता होगी। इसके विपरीत यदि आप केवल कुछ विश्लेषणात्मक POJO पृष्ठ चाहते हैं, तो उसी क्वेरी का myBatis कार्यान्वयन तुच्छ होगा।

इस वजह से, MyBatis SELECTS पर हाइबरनेट से तेज है।

ये दो मामले कमांड्स के बीच का अंतर है जहां आप डोमेन डेटा और रिस्पॉन्स को बदलना चाहते हैं जहां आप केवल कुछ डेटा प्राप्त करना चाहते हैं।

तो, इन दो मामलों पर विचार करें और आपका आवेदन क्या करता है। यदि आपके पास एक साधारण डोमेन है और बस जानकारी प्राप्त करना है, तो myBatis का उपयोग करें। यदि आपके पास एक जटिल डोमेन है और संस्थाओं को बनाए रखना है, तो हाइबरनेट का उपयोग करें। यदि आप दोनों करते हैं, तो हाइब्रिड दृष्टिकोण पर विचार करें। यही कारण है कि हम अपनी परियोजना पर उपयोग करते हैं जिसमें हजारों इकाइयां हैं जो इसे नियंत्रण में रखती हैं। ;)


23

ORM बनाम दृढ़ता फ्रेमवर्क

हाइबरनेट ऑब्जेक्ट-रिलेशन मैपिंग फ्रेमवर्क (ORM) है जो जावा क्लासेस को डेटाबेस टेबल पर मैप करता है। MyBatis दृढ़ता फ्रेमवर्क है - ORM नहीं। यह जावा विधियों के लिए एसक्यूएल स्टेटमेंट को मैप करता है।

डेटाबेस स्कीमा

हाइबरनेट आपके जावा मॉडल के अनुसार डेटाबेस स्कीमा बना या मान्य कर सकता है जबकि MyBatis के पास ऐसी कोई सुविधा नहीं है। जब आप इन-मेमोरी डीबी का उपयोग कर रहे हों तो यह पर्यावरण के परीक्षण के लिए भी सुविधाजनक है। संबंधित चर्चाएँ:

कैश

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

आशावादी ताला प्रबंधन

इसके अलावा आशावादी लॉक प्रबंधन के लिए मतभेद हैं:

MyVatis आशावादी सहूलियत नियंत्रण का मूल रूप से समर्थन नहीं करता, @Version घोषणा के साथ Hibernate / JPA जैसे ORM टूल के विपरीत।

संबंधित चर्चा:

धीरे लोड हो रहा है

हाइबरनेट आलसी लोडिंग के लिए चिह्नित वस्तुओं को छोड़कर पूरे ऑब्जेक्ट ग्राफ को लोड करने का प्रयास करेगा। myBatis SQL क्वेरी के अनुसार डेटा लोड करेगा। आलसी लोडिंग प्रदर्शन में सुधार कर सकती है लेकिन यह <property name="hibernate.enable_lazy_load_no_trans" value="true" /> गुणों के साथ उपयोग किए जाने पर कनेक्शन लीक का कारण बन सकती है । संबंधित चर्चा:

हाइबरनेट सत्र प्रबंधन

हाइबरनेट सत्र के माध्यम से बचत, अद्यतन या हटाने जैसे एंटिटी ऑपरेशन किए जाते हैं । यह अच्छी समझ की आवश्यकता है कि हाइबरनेट से detached entity passed to persistसंबंधित और अन्य घटनाओं से बचने के लिए उचित हाइबरनेट सत्र प्रबंधन रणनीति को कैसे लागू किया जाए ।

कभी-कभी अधिक हाइबरनेट व्यवहार को समझने की कोशिश करने में अधिक समय लग सकता है, थोड़ा और काम जोड़ने के लिए और myBatis के लिए कच्चे एसक्यूएल बयान लिखने के लिए।

व्यापक

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

प्रश्नों

MyBatis में आप लगभग सादे SQL क्वेरी लिखेंगे। हाइबरनेट में क्वेरी बनाने के लिए कई विकल्प हैं: SQL, HQL, मानदंड एपीआई। कभी-कभी मापदंड में कई वैकल्पिक क्षेत्र होने पर आप मानदंड एपीआई का उपयोग करने के लिए उपयुक्त हो सकते हैं। यह क्वेरी बनाने के लिए अधिक संरचित दृष्टिकोण प्रदान करेगा और शायद संबंधित गलतियों से बचें।


18

इस तुलना को संक्षेप में बताने के लिए क्लेटस ने बहुत अच्छा काम किया। हाइबरनेट अच्छी तरह से काम करता है जब आप डेटा मॉडल को नियंत्रित करते हैं और अधिक ऑब्जेक्ट-केंद्रित होते हैं जबकि iBATIS अच्छी तरह से काम करता है जब आपको किसी मौजूदा डेटाबेस के साथ एकीकृत करने की आवश्यकता होती है और अधिक डेटा-केंद्रित होती है।

इसके अलावा मुझे लगता है कि हाइबरनेट में सीखने की अवस्था थोड़ी अधिक है। IBATIS के साथ, यह जानना बहुत आसान है कि हाइबरनेट के साथ अधिक "जादू" क्या होता है। दूसरे शब्दों में, newbies को iBatis का उपयोग करना और समझना आसान हो सकता है।

लेकिन मैं यह नहीं कह रहा हूं कि आपको आईबैटिस पसंद करना चाहिए, आईबैटिस और हाइबरनेट सिर्फ ऊपर बताए अनुसार अलग हैं।

और वैसे, यदि आप हाइबरनेट के लिए जाते हैं, तो शायद हाइबरनेट एनोटेशन द्वारा प्रदान किए गए मानकीकृत जेपीए और ईजेबी 3.0 (जेएसआर -२२०) ऑब्जेक्ट / रिलेशनल मैपिंग एनोटेशन का उपयोग करने पर विचार करें ।


8

हाइबरनेट एक ओआरएम है, जिसका अर्थ है (इसके सबसे बुनियादी स्तर पर) यह एक डेटाबेस टेबल में वास्तविक पंक्तियों के लिए जावा ऑब्जेक्ट्स के उदाहरणों को मैप करता है। आमतौर पर, पूजो को हाइबरनेट के माध्यम से पुनः प्राप्त करने के लिए: डेटाबेस में इन पूजो के लिए कोई भी हेरफेर और संशोधन दिखाई देगा। हाइबरनेट एक उपयुक्त समय पर संबंधित SQL उत्पन्न और निष्पादित करेगा।

Mybatis (अपने सबसे बुनियादी स्तर पर) बस एक साथ piecing और SQL को निष्पादित करने के लिए एक उपकरण है जो xml फ़ाइलों में संग्रहीत है। यह डेटाबेस तालिका में पंक्तियों के लिए जावा ऑब्जेक्ट के उदाहरणों को मैप नहीं करता है, बल्कि यह एसक्यूएल स्टेटमेंट के लिए जावा विधियों को मैप करता है, और इसलिए यह ओआरएम नहीं है। यह पूजो की वापसी भी कर सकता है, लेकिन वे किसी भी तरह के हठ के संदर्भ में नहीं बंधे हैं।

दोनों उपकरण ऊपर वर्णित से बहुत अधिक करते हैं, लेकिन एक ओआरएम है और एक नहीं है।

यह मानने के लिए कि आपको कौन सा उपयोग करना है, यह मानने के लिए मापदंड, आपके द्वारा काम किए जाने वाले डेटाबेस मॉडल पर गंभीर रूप से निर्भर करता है।

उदाहरण के लिए, कुछ बीमा मॉडल का प्रतिनिधित्व करने वाले एक बड़े विशाल स्कीमा की कल्पना करें। डेवलपर्स को डेटा पुनर्प्राप्त करने की आवश्यकता होती है, और उस डेटा के साथ एक तरह से बातचीत करते हैं जो हाथ में व्यवसाय को पूरा करता है।

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

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

मेरे विस्तार में, हाइबरनेट और मायबैटिस दोनों का उपयोग एक ही परियोजना पर नियमित रूप से किया जाता है।

जहां हाइबरनेट का इस्तेमाल किया जा रहा है

  • सामान्य CRUD कार्यक्षमता
  • 'चलना' 'डोमेन ऑब्जेक्ट' संबंधपरक मॉडल
  • सत्र प्रबंधन

और जहां Mybatis के लिए इस्तेमाल किया जा रहा है

  • तदर्थ प्रश्न
  • संग्रहीत प्रक्रियाओं को बंद करें (और उनके साथ बातचीत करें)
  • बहुत विशिष्ट या जटिल प्रश्नों का समर्थन करें
  • जटिल खोज प्रश्नों का समर्थन करें, जहाँ खोज मापदंड गतिशील है, और परिणामों के पृष्ठन

6

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

कोई कारण नहीं है कि इसे "सभी या कोई भी" निर्णय नहीं होना चाहिए। अपनी स्थिति के लिए सबसे अच्छा उपयोग करें।


8
स्प्रिंग जेडीबीसी, इबैटिस से काफी कम है। एक बात के लिए आपको या तो पंक्ति मैपर्स (थकाऊ) लिखना होगा या स्प्रिंग की बीन मैपिंग अविश्वसनीय रूप से धीमी है। इससे कोई फर्क नहीं पड़ता कि आप स्प्रिंग एमवीसी में एक फॉर्म को बाँध रहे हैं लेकिन यह सुनिश्चित करता है कि यदि आप हजारों पंक्तियों को वापस कर रहे हैं। मैंने एक स्पष्ट पंक्ति मैपर के साथ स्प्रिंग JDBC में स्प्रिंग की बीन मैपिंग को प्रतिस्थापित करके निष्पादन समय को 50+ सेकंड से <2 तक काट दिया, लेकिन कौन लिखना चाहता है?
cletus
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.