2012-06-21 9 views
6

मैंने कल सभी को हाइबरनेट पर विभिन्न लेख/ट्यूटोरियल पढ़ने में बिताया और हालांकि मैं उड़ा हुआ कितना शक्तिशाली है, इसके साथ मुझे एक बड़ी चिंता है।क्या हाइबरनेट को डेटाबेस डिज़ाइन ड्राइव करना है?

ऐसा लगता है कि मानक अभ्यास है Hibernate को आपके डीबी स्कीमा को के लिए डिज़ाइन/जेनरेट करने की अनुमति देता है, जो कि एक नई और डरावनी अवधारणा है जिसे मैं चकित कर रहा हूं। मैंने पढ़े गए ट्यूटोरियल से, आप बस अपनी hibernate.cfg.xml कॉन्फ़िगरेशन फ़ाइल में एक नई इकाई जोड़ें, @Entity के साथ इच्छित किसी भी POJO को एनोटेट करें, और वॉयला - हाइबरनेट आपके लिए टेबल बनाता है।

  • क्या होगा अगर आप पहले से ही एक DB स्कीमा और एक हाइबरनेट आप इसे के अनुरूप नहीं है के लिए उत्पन्न करने के लिए चाहता है: हालांकि यह बहुत अच्छा है, यह मेरे परिदृश्यों के एक मुट्ठी भर के बारे में सोच है? क्या होगा यदि आपके पास पागल डीबीए है जो प्री-डिफ़ाइंड (गैर-हाइबरनेट) स्कीमा पर झुकाव से इंकार कर देता है?
  • क्या होगा यदि आपके पास हजारों रिकॉर्ड (दुनिया के सभी शहरों की तरह) के साथ संदर्भ तालिकाओं हैं? क्या आपको तुरंत और save() हजारों अद्वितीय POJOs को चालू करना होगा या क्या हाइबरनेट को कॉन्फ़िगर करने का कोई तरीका है, जिससे यह आपके टेबल में पहले से मौजूद डेटा को सम्मानित और ओवरराइट नहीं करेगा?
  • यदि आप अपनी स्कीमा/टेबल पर पेर्फ ट्यूनिंग करना चाहते हैं तो क्या होगा? इसमें इंडेक्सिंग शामिल है, जो हाइबरनेट स्वचालित रूप से बनाता है ऊपर और परे सामान्यीकृत?
  • यदि आप अपनी तालिकाओं में बाधाएं या ट्रिगर्स जोड़ना चाहते हैं तो क्या होगा? इंडेक्स?

मैं इस की जड़ में लगता है निम्नलिखित:

ऐसा लगता है कि हाइबरनेट बनाता है और अपने डीबी पर एक विशेष स्कीमा/config बलों की तरह। मैं सोच रहा हूं कि यह एजेंडा हमारे प्लेटफार्म मानकों, हमारे डीबीए दर्शनों, और हाइबरनेट के साथ बातचीत करने वाली ट्यून/ट्विक टेबल को टर्न करने की हमारी क्षमता के साथ कैसे संघर्ष करेगा।

अग्रिम धन्यवाद।

उत्तर

2

हाइबरनेट कई वस्तुओं/पुस्तकालयों की तरह वस्तुओं को मैप करने के लिए डिफ़ॉल्ट तरीके से आता है, यह सादगी के लिए कॉन्फ़िगरेशन पर सम्मेलन का पक्ष लेता है।

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

यदि आप इसे सही तरीके से करते हैं, तो आपको मौजूदा डेटा को तुरंत चालू करने और सहेजने की आवश्यकता नहीं है, क्योंकि यह व्यर्थ होगा - डेटाबेस में पहले से ही है जो कि हाइबरनेट समझने वाले रूप में इकाइयों के बारे में जानकारी शामिल है। (इसके बारे में सोचें - लोड करने के लिए और फिर तुरंत एक इकाई को सहेजना हमेशा एक नो-ओप होना चाहिए, और इसलिए पूरी तरह से छोड़ा जा सकता है।)

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

1

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

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

हाइबरनेट के पीछे की अवधारणा डाटाबेस और ऑब्जेक्ट्स को मैप करना है। इसलिए इसे ओआरएम (ऑब्जेक्ट-रिलेशनल मैपिंग) टूल कहा जाता है।
ऑब्जेक्ट रिलेशनल इम्पैडेंस के लिए here पढ़ें।

4

मुझे लगता है कि आप हाइबरनेट को बहुत अधिक शक्ति का श्रेय दे रहे हैं।

हाइबरनेट में एक मुहावरे है जो डेटाबेस कार्यान्वयन को प्रभावित कर सकता है।

हाइबरनेट आपके लिए एक स्कीमा उत्पन्न नहीं करता है जबतक कि आप ऐसा करने के लिए नहीं कहें। मौजूदा स्कीमा से शुरू करना संभव है और इसे हाइबरनेट का उपयोग करके जावा ऑब्जेक्ट्स पर मैप करना संभव है। लेकिन यदि स्कीमा हाइबरनेट आवश्यकताओं के साथ संघर्ष करता है तो यह संभव या इष्टतम नहीं हो सकता है।

यदि डीबीए कड़वाहट नहीं करेगा - जैसा कि उन्हें नहीं करना चाहिए - या हाइबरनेट आपको समायोजित नहीं कर सकता है, तो आपके पास आपका जवाब है: आप हाइबरनेट का उपयोग नहीं कर सकते।

आपका डीबीए सहमति दे सकता है, लेकिन आपके ऐप को यह पता चल सकता है कि हाइबरनेट द्वारा आपके लिए जेनरेट किया गया गतिशील एसक्यूएल वह नहीं है जो आप चाहते हैं।

सौभाग्य से आपके लिए, यह शहर में एकमात्र गेम नहीं है।

मुझे नहीं लगता कि कार्यान्वयन सभी या कोई नहीं होना चाहिए। यदि आप संदर्भ डेटा तक पहुंचने के लिए सरल जेडीबीसी का उपयोग करते हैं, तो नुकसान क्या है?

डाटाबेस डिजाइन विचारों को हाइबरनेट से स्वतंत्र होना चाहिए। बाधाएं, ट्रिगर्स, सामान्यीकरण, और इंडेक्स को व्यावसायिक आवश्यकताओं से प्रेरित किया जाना चाहिए, न कि आपके मिडलवेयर विकल्प।

यदि आपके पास ठोस ऑब्जेक्ट मॉडल नहीं है, या स्कीमा इसे समायोजित नहीं कर सकता है, तो आपको हाइबरनेट पर पुनर्विचार करना चाहिए। सीधे जेडीबीसी, संग्रहीत प्रक्रियाओं, वसंत जेडीबीसी, और iBatis विकल्प के रूप में है।

0

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

जब तक मैपिंग डेटाबेस में टेबल और कॉलम पाता है, तो सब कुछ ठीक है।

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

0
  • क्या होगा अगर आप पहले से ही एक DB स्कीमा है ...

मैं जहां कि इंप्रेशन प्राप्त करके पता नहीं है। हाइबरनेट मौजूदा स्कीमा का उपयोग कर सकते हैं। यह काफी लचीला है।

  • यदि आपके पास संदर्भ तालिकाएं हैं तो क्या होगा ...

संबंध LAZY बनाएं, और यह स्वचालित रूप से लोड नहीं होगा। केवल बदली गई वस्तु सहेजी जाएगी।

  • क्या होगा यदि आप पर्फ़ ट्यूनिंग क्या करना चाहते हैं ...

बस उत्पन्न स्कीमा का उपयोग नहीं करते। यह सिर्फ एक शुरुआती बिंदु है। आपको आवश्यकता के अनुसार अनुकूलित कर सकते हैं।

  • यदि आप अपनी तालिकाओं में बाधाएं या ट्रिगर्स जोड़ना चाहते हैं तो क्या होगा? इंडेक्स?

ऊपर जैसा कुछ।

0

आप मौजूदा डेटाबेस स्कीमा के साथ हाइबरनेट का उपयोग कर सकते हैं। आप मौजूदा तालिकाओं और स्तंभों को मैप करने के उदाहरण के लिए विभिन्न व्याख्या का उपयोग कर सकते हैं:

@Table (नाम = "dbschema.dbTable") - रखा जाना चाहिए अपने वर्ग फ़ाइल यह @Column (नाम मैप करने के लिए इससे पहले कि = " colName ") - एक स्तंभ मैप करने के लिए

बस सुनिश्चित करें कि हाइबरनेट इस विकल्प के साथ कॉन्फ़िगर किया गया है हो सकता है: hibernate.hbm2ddl.auto = अद्यतन

आप इस बनाने यह स्कीमा पैदा करेगा, ऐसा करने के लिए सेट करते हैं अपने मामले में ऐसा मत करो।

+0

असल में, आपको इसे किसी भी पर सेट करना चाहिए, और अपनी अपडेट प्रक्रिया के हिस्से के रूप में स्कीमा अपडेट करना चाहिए। यह एंटरप्राइज़ दुनिया में काफी मानक है। – Matt

1

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

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

नतीजतन, आप स्वयं एसक्यूएल लिखते हैं, और आप मिलान करने के लिए हाइबरनेट मैपिंग करते हैं। इसका मतलब यह नहीं है कि आपका ऑब्जेक्ट डिज़ाइन आपके SQL को प्रभावित नहीं करेगा, लेकिन आपको अभी भी हमेशा अपनी स्कीमा को आगे बनाना चाहिए।

0

एप्राइपिएट करते समय हाइबरनेट/जेपीए का उपयोग करें। ऐप्स को डिज़ाइन करते समय एक सामान्य प्रथा ड्राफ्ट निकालने और जरूरतों (इंडेक्स इत्यादि) के बाद इसे मैन्युअल रूप से बदलना है। हालांकि, अगर आप डीबी लेआउट को चीजों को करने के लिए हाइबरनेट तरीके से बदलते हैं तो यह आपके लिए दर्द होगा। जेपीए की सुंदरता खो जाएगी। उन कार्यों के लिए जिनके लिए भारी प्रदर्शन ट्यूनिंग और पूर्ण नियंत्रण की आवश्यकता होती है - बस reguar jdbc के लिए जाएं।

0

कुछ उत्तर:
ए। इंडेक्स एनोटेशन जोड़ना संभव है: table एनोटेशन देखें।

बी। यदि आपके पास संदर्भ सारणी हैं, तो आप आलसी लाने या उत्सुक लाने का विकल्प चुन सकते हैं (यानी - यदि आपकी तालिका किसी व्यक्ति और उसकी किताबों का प्रतिनिधित्व करती है - चाहे किसी व्यक्ति को अपनी पुस्तक के बिना लोड किया जाए या अपनी किताबों के साथ)

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

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

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

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

संबंधित मुद्दे