अच्छा प्रश्न का चयन करेंगे।
मैं कई वर्षों में कई परियोजनाओं में इसका उपयोग करने के बाद हाइबरनेट का एक बड़ा प्रशंसक था। मुझे विश्वास था कि किसी भी परियोजना को हाइबरनेट करने के लिए डिफ़ॉल्ट होना चाहिए।
आज मुझे इतना यकीन नहीं है।
कुछ चीजों के लिए हाइबरनेट (और जेपीए) बहुत बढ़िया है, खासकर विकास चक्र में। जेडीबीसी के साथ हाइबरनेट के साथ काम करने के लिए कुछ तेज़ है। आपको मुफ्त - कैशिंग, आशावादी लॉकिंग आदि के लिए बहुत सारी सुविधाएं मिलती हैं।
दूसरी ओर इसमें कुछ छिपी हुई लागतें हैं। जब आप शुरू करते हैं तो हाइबरनेट धोखे से सरल होता है। कुछ ट्यूटोरियल का पालन करें, अपनी कक्षा पर कुछ एनोटेशन डालें - और आपको खुद को दृढ़ता मिली है। लेकिन यह आसान नहीं है और इसमें अच्छे कोड लिखने में सक्षम होने के लिए इसके आंतरिक कार्य और डेटाबेस डिजाइन दोनों की अच्छी समझ की आवश्यकता है। यदि आप अभी शुरू कर रहे हैं तो आपको कुछ मुद्दों के बारे में पता नहीं हो सकता है जो आपको बाद में काट सकते हैं, इसलिए यहां एक अपूर्ण सूची है।
प्रदर्शन
क्रम प्रदर्शन अच्छा है पर्याप्त, मैं अभी तक एक स्थिति है जहाँ हाइबरनेट उत्पादन में खराब प्रदर्शन का कारण था यह देखने के लिए की है। समस्या स्टार्टअप प्रदर्शन है और यह आपके यूनिट परीक्षण समय और विकास प्रदर्शन को कैसे प्रभावित करती है। जब हाइबरनेट लोड होता है तो यह सभी इकाइयों का विश्लेषण करता है और बहुत से प्री-कैशिंग करता है - इसमें बहुत अधिक आवेदन के लिए लगभग 5-10-15 सेकंड लग सकते हैं। तो आपका 1 सेकंड यूनिट टेस्ट अब 11 सेकेंड लेने जा रहा है। मज़ा नहीं।
डाटाबेस स्वावलंबन
यह जब तक आप डेटाबेस पर कुछ ट्यूनिंग क्या करने की जरूरत नहीं है के रूप में बहुत अच्छा है।
में स्मृति सत्र
हर लेन-देन के लिए हाइबरनेट हर डेटाबेस के लिए स्मृति में एक वस्तु का संग्रह किया जायेगा यह पंक्ति "स्पर्श"। जब आप कुछ सरल डेटा एंट्री कर रहे हों तो यह एक अच्छा अनुकूलन है। यदि आपको किसी कारण से कई ऑब्जेक्ट्स को संसाधित करने की आवश्यकता है, तो यह प्रदर्शन को गंभीरता से प्रभावित कर सकता है, जब तक कि आप अपने आप में इन-मेमोरी सत्र को स्पष्ट रूप से और सावधानीपूर्वक साफ़ न करें।
Cascades
Cascades आप वस्तु रेखांकन के साथ काम आसान बनाने के लिए अनुमति देते हैं। उदाहरण के लिए यदि आपके पास रूट ऑब्जेक्ट और कुछ बच्चे हैं और आप रूट ऑब्जेक्ट को सहेजते हैं, तो आप बच्चों को बचाने के लिए हाइबरनेट को कॉन्फ़िगर कर सकते हैं। समस्या तब शुरू होती है जब आपका ऑब्जेक्ट ग्राफ़ जटिल हो जाता है। जब तक आप बेहद सावधान न हों और आंतरिक रूप से क्या हो रहा है, इसकी अच्छी समझ हो, तो इसे गड़बड़ करना आसान है। और जब आप करते हैं तो उन समस्याओं को डीबग करना बहुत कठिन होता है।
लेज़ी लोड हो रहा है
लेज़ी लोड हो रहा है इसका मतलब है कि हर बार जब आप एक वस्तु लोड, हाइबरनेट सब यह संबंधित है वस्तुओं लोड नहीं होगा, लेकिन इसके बजाय जगह धारकों जो जैसे ही आप उन तक पहुंचने की कोशिश का समाधान हो जाएगा प्रदान करेगा। महान अनुकूलन सही है? यह है, सिवाय इसके कि आपको इस व्यवहार से अवगत होना चाहिए अन्यथा आपको गुप्त त्रुटियां मिलेंगी। एक उदाहरण के लिए Google "LazyInitializationException"। और प्रदर्शन के साथ सावधान रहें। आप अपनी ऑब्जेक्ट्स और ऑब्जेक्ट ग्राफ़ को कैसे लोड करते हैं, इसके आधार पर आप "n + 1 समस्या का चयन कर सकते हैं" दबा सकते हैं। अधिक जानकारी के लिए Google इसे।
स्कीमा उन्नयन
हाइबरनेट सिर्फ पुनर्रचना जावा कोड और पुनरारंभ द्वारा आसान स्कीमा परिवर्तन की अनुमति देता है। जब आप शुरू करते हैं तो यह बहुत अच्छा होता है। लेकिन फिर आप संस्करण एक जारी करते हैं। और जब तक कि आप अपने ग्राहकों को खोना नहीं चाहते हैं, आपको स्कीमा अपग्रेड स्क्रिप्ट प्रदान करने की आवश्यकता है। जिसका मतलब है कि कोई भी सरल रिफैक्टरिंग नहीं है क्योंकि सभी स्कीमा परिवर्तन SQL में किए जाने चाहिए।
दृश्य और संग्रहित प्रक्रियाओं
हाइबरनेट डेटा यह साथ काम करता है के लिए विशेष लेखन पहुँच की आवश्यकता है। जिसका अर्थ है कि आप वास्तव में विचारों, संग्रहित प्रक्रियाओं और ट्रिगर्स का उपयोग नहीं कर सकते हैं क्योंकि इससे हाइबरनेट के डेटा में परिवर्तन हो सकता है, जो उन्हें नहीं जानते हैं। अलग-अलग लेन-देन में डेटाबेस में डेटा लिखने के लिए आप कुछ बाहरी प्रक्रियाएं कर सकते हैं। लेकिन यदि आप करते हैं, तो आपके कैश में अमान्य डेटा होगा। देखभाल करने के लिए एक और बात कौन सा है।
एकल पिरोया सत्र
हाइबरनेट सत्र एकल पिरोया जाता है। किसी सत्र के माध्यम से लोड की गई किसी ऑब्जेक्ट को केवल उसी थ्रेड से एक्सेस किया जा सकता है (पढ़ने सहित)। यह सर्वर साइड अनुप्रयोगों के लिए स्वीकार्य है लेकिन यदि आप जीयूआई आधारित आवेदन कर रहे हैं तो चीजों को अनावश्यक जटिल बना सकते हैं।
मुझे लगता है कि मेरा बिंदु यह है कि कोई निःशुल्क भोजन नहीं है।
हाइबरनेट एक अच्छा उपकरण है, लेकिन यह एक जटिल उपकरण है, और इसे सही तरीके से समझने के लिए समय की आवश्यकता है। यदि आप या आपके टीम के सदस्यों के पास ऐसा ज्ञान नहीं है तो यह एक ही आवेदन के लिए शुद्ध जेडीबीसी (या स्प्रिंग जेडीबीसी) के साथ जाने के लिए सरल और तेज़ हो सकता है। दूसरी तरफ यदि आप भविष्य में सीखने में समय (इसे करने और डिबगिंग करके सीखने सहित) सीखने के इच्छुक हैं तो आप ट्रेडऑफ को बेहतर समझ पाएंगे।
अन्य संभावनाएं हैं। IBATIS http://iBATIS.apache.org/ –
ओवरकिल के बारे में क्या? संकल्पनात्मक ओवरकिल? एक और जार? – Surya
मैं एक परत जोड़ने के लिए अतिरिक्त प्रसंस्करण ओवरहेड में ओवरकिल सोच रहा था, इसे बनाए रखने के लिए आवश्यक अतिरिक्त डेवलपर कौशल (मेरे पास कौशल है, लेकिन मुझे इसके बारे में सोचना है कि जब मैं इसे बनाए रखने वाला नहीं हूं), इसके बजाय एक तृतीय पक्ष के साथ मिलकर मूल (हालांकि अतिरिक्त जार AFAIC कोई मुद्दा नहीं हैं)। उस तरह की चीज। अच्छी पूछताछ रवैये के लिए – jmq