java Hibernate hbm2ddl.auto संभावित मान और वे क्या करते हैं?




(11)

मैं वास्तव में अद्यतन, निर्यात और मूल्यों के बारे में अधिक जानना चाहता हूं जो hibernate.hbm2ddl.auto को दिए जा सकते hibernate.hbm2ddl.auto
मुझे पता होना चाहिए कि अद्यतन का उपयोग कब करें और कब नहीं? और विकल्प क्या है?

ये परिवर्तन हैं जो डीबी पर हो सकते हैं:

  • नई टेबल
  • पुरानी टेबल में नए कॉलम
  • कॉलम हटा दिए गए
  • कॉलम का डेटा प्रकार बदल गया
  • एक कॉलम के एक प्रकार ने इसे गुण बदल दिया
  • टेबल गिरा दिया गया है
  • कॉलम के मान बदल गए हैं

प्रत्येक मामले में सबसे अच्छा समाधान क्या है?


सिद्धांत रूप में, आप अपने मॉडल में परिवर्तन के साथ अपने डेटाबेस को अद्यतन करने के लिए hibernate.hbm2ddl.auto = अद्यतन सेट कर सकते हैं, लेकिन मैं उस पर उत्पादन डेटाबेस पर भरोसा नहीं करता। दस्तावेज के एक पुराने संस्करण ने कहा कि यह कम से कम प्रयोगात्मक था; मुझे वर्तमान स्थिति नहीं पता है।

इसलिए, हमारे उत्पादन डेटाबेस के लिए, hibernate.hbm2ddl.auto सेट न करें - डिफ़ॉल्ट डेटाबेस परिवर्तन नहीं करना है। इसके बजाए, हम मैन्युअल रूप से एक SQL DDL अद्यतन स्क्रिप्ट बनाते हैं जो एक संस्करण से अगले संस्करण में परिवर्तन लागू करता है।


मान्य करें: स्कीमा को मान्य करें, डेटाबेस में परिवर्तन न करें। अद्यतन: वर्तमान में निष्पादित क्वेरी के साथ स्कीमा अपडेट करें। बनाएं: हर बार नई स्कीमा बनाता है, और पिछले डेटा को नष्ट कर देता है। बिल्ड-ड्रॉप: एप्लिकेशन बंद होने पर स्कीमा ड्रॉप करें या सत्र फैक्ट्री स्पष्ट रूप से बंद है।


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


सत्रफैक्टरी बनने पर hibernate.hbm2ddl.auto स्वचालित रूप से स्कीमा को डीडीएल मान्य करता है और निर्यात करता है।

डिफ़ॉल्ट रूप से, यह डीबी पर स्वचालित रूप से कोई सृजन या संशोधन नहीं करता है। यदि उपयोगकर्ता निम्न मानों में से एक सेट करता है तो यह स्वचालित रूप से डीडीएल स्कीमा परिवर्तन कर रहा है।

  • बनाएँ - एक स्कीमा बनाने कर

    <entry key="hibernate.hbm2ddl.auto" value="create">
    
  • अद्यतन - मौजूदा स्कीमा को अद्यतन करना

    <entry key="hibernate.hbm2ddl.auto" value="update">
    
  • मान्य करें - मौजूदा स्कीमा को मान्य करें

    <entry key="hibernate.hbm2ddl.auto" value="validate">
    
  • बनाएँ-ड्रॉप - सत्र शुरू होने और समाप्त होने पर स्कीमा को स्वचालित रूप से बनाएं और छोड़ें

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
    

कॉन्फ़िगरेशन प्रॉपर्टी को hibernate.hbm2ddl.auto कहा जाता hibernate.hbm2ddl.auto

हमारे विकास पर्यावरण में हम hibernate.hbm2ddl.auto=create-drop को ड्रॉप और ड्रॉप करते समय प्रत्येक बार एक स्वच्छ डेटाबेस बनाते हैं, ताकि हमारा डेटाबेस ज्ञात स्थिति में हो।

सिद्धांत रूप में, आप अपने मॉडल में परिवर्तन के साथ अपने डेटाबेस को hibernate.hbm2ddl.auto=update करने के लिए hibernate.hbm2ddl.auto=update सेट कर सकते हैं, लेकिन मैं उस पर उत्पादन डेटाबेस पर भरोसा नहीं करता। दस्तावेज के एक पुराने संस्करण ने कहा कि यह कम से कम प्रयोगात्मक था; मुझे वर्तमान स्थिति नहीं पता है।

इसलिए, हमारे उत्पादन डेटाबेस के लिए, hibernate.hbm2ddl.auto सेट न करें - डिफ़ॉल्ट डेटाबेस परिवर्तन नहीं करना है। इसके बजाए, हम मैन्युअल रूप से एक SQL DDL अद्यतन स्क्रिप्ट बनाते हैं जो एक संस्करण से अगले संस्करण में परिवर्तन लागू करता है।


मैंने सबसे आम हाइबरनेट डीडीएल पीढ़ी की रणनीतियों के लिए एक ब्लॉग पोस्ट समर्पित किया:

  1. hibernate.hbm2ddl.auto="update" सुविधाजनक है लेकिन कम लचीला है यदि आप फ़ंक्शन जोड़ने या कुछ कस्टम स्क्रिप्ट निष्पादित करने की योजना बनाते हैं।
  2. Flyway का उपयोग करना सबसे लचीला दृष्टिकोण है।

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


मुझे लगता है कि आपको ध्यान देना चाहिए

SchemaExport Class 

यह कक्षा आपके कॉन्फ़िगरेशन गतिशील बनाता है, इसलिए यह आपको जो भी सुइट्स चुनता है उसे चुनने की अनुमति देता है ...

चेकआउट [SchemaExport]


यद्यपि यह काफी पुरानी पोस्ट है, लेकिन जैसा कि मैंने इस विषय पर कुछ शोध किया है, इसलिए इसे साझा करने के बारे में सोचा।

hibernate.hbm2ddl.auto

दस्तावेज के अनुसार इसमें चार वैध मान हो सकते हैं:

बनाएँ | अपडेट करें | मान्य करें | बनाने ड्रॉप

इन मानों द्वारा दिखाए गए व्यवहार की व्याख्या निम्नलिखित है:

  • बनाएं : - स्कीमा बनाएं, स्कीमा में पहले मौजूद डेटा (यदि वहां है) खो गया है
  • अद्यतन करें: - दिए गए मानों के साथ स्कीमा अपडेट करें।
  • मान्य करें: - स्कीमा को मान्य करें। यह डीबी में कोई बदलाव नहीं करता है।
  • निर्माण-ड्रॉप: - पहले मौजूद डेटा को नष्ट करने के साथ स्कीमा बनाएं (यदि वहां है)। सत्र फैक्ट्री बंद होने पर यह डेटाबेस स्कीमा भी छोड़ देता है।

ध्यान देने योग्य महत्वपूर्ण बिंदु निम्नलिखित हैं:

  • अद्यतन के मामले में, यदि स्कीमा डीबी में मौजूद नहीं है तो स्कीमा बनाया गया है।
  • वैध होने के मामले में, यदि डीबी में स्कीमा मौजूद नहीं है, तो यह नहीं बनाया गया है। इसके बजाए, यह एक त्रुटि फेंक देगा: - Table not found:<table name>
  • निर्माण-ड्रॉप के मामले में, सत्र बंद करने पर स्कीमा नहीं छोड़ा गया है। यह केवल सत्र फैक्ट्री को बंद करने पर ही गिरता है।
  • यदि मैं इस संपत्ति के लिए कोई मूल्य देता हूं (ऊपर चर्चा की गई चार मूल्यों के बजाय एबीसी कहें) या यह अभी खाली है। यह निम्नलिखित व्यवहार दिखाता है:

    -यदि स्कीमा डीबी में मौजूद नहीं है: - यह स्कीमा बनाता है

    - अगर स्कीमा डीबी में मौजूद है: - स्कीमा अपडेट करें।


validate : यह स्कीमा को मान्य करता है और डीबी में कोई बदलाव नहीं करता है।
मान लीजिए कि आपने मैपिंग फ़ाइल में एक नया कॉलम जोड़ा है और सम्मिलित ऑपरेशन निष्पादित किया है, यह एक अपवाद फेंक देगा "एक्सवाईजेड कॉलम गायब है" क्योंकि मौजूदा स्कीमा उस ऑब्जेक्ट से अलग है जिसे आप डालने जा रहे हैं। यदि आप मैन्युअल रूप से उस नए कॉलम को जोड़कर तालिका को बदलते हैं तो सम्मिलित करें ऑपरेशन करें तो यह निश्चित रूप से तालिका में नए कॉलम के साथ सभी कॉलम डालेगा। इसका मतलब यह मौजूदा स्कीमा / तालिका में कोई बदलाव नहीं करता / बदलता नहीं है।

update : जब आप ऑपरेशन करते हैं तो यह डेटाबेस में मौजूदा तालिका को बदल देता है। आप hbm2ddl के इस विकल्प के साथ कॉलम जोड़ या निकाल सकते हैं। लेकिन यदि आप एक नया कॉलम जोड़ने जा रहे हैं जो 'पूर्ण नहीं' है तो यह उस विशेष कॉलम को डीबी में जोड़कर अनदेखा कर देगा। क्योंकि यदि आप मौजूदा तालिका में 'न्यूल न्यूल' कॉलम जोड़ना चाहते हैं तो तालिका खाली होनी चाहिए।


सामुदायिक दस्तावेज़ीकरण से :

hibernate.hbm2ddl.auto सत्र फ़ैक्टरी बनने पर डेटाबेस को स्कीमा डीडीएल स्वचालित रूप से मान्य या निर्यात करता है। बिल्ड-ड्रॉप के साथ, सत्र फ़ैक्टरी स्पष्ट रूप से बंद होने पर डेटाबेस स्कीमा को हटा दिया जाएगा।

उदाहरण के लिए मान्य करें अपडेट करें | बनाएँ | बनाने ड्रॉप

तो संभावित विकल्पों की सूची हैं,

  • मान्य करें : स्कीमा को मान्य करें, डेटाबेस में कोई बदलाव नहीं करता है।
  • अद्यतन : स्कीमा अपडेट करें।
  • बनाएँ : पिछले डेटा को नष्ट करने, स्कीमा बनाता है।
  • बिल्ड -ड्रॉप : स्कीमा ड्रॉप करें जब सत्र फैक्ट्री स्पष्ट रूप से बंद हो जाती है, आमतौर पर जब एप्लिकेशन बंद हो जाता है।

ये विकल्प डेवलपर टूल बनने के लिए प्रतीत होते हैं और किसी भी उत्पादन स्तर डेटाबेस को सुविधाजनक बनाने के लिए नहीं, आप निम्न प्रश्नों को देखना चाहते हैं; हाइबरनेट: hbm2ddl.auto = उत्पादन में अद्यतन?


पूरी तरह अक्षम करने के लिए "none" का अनियंत्रित मान भी है।







hbm2ddl