2012-09-01 21 views
5

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

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

मेरे ज्ञान के लिए हाइबरनेट तालिकाओं में कोई बदलाव नहीं करता है जब तक hibernate.hbm2ddl.auto = बनाएं, लेकिन वास्तव में सभी डेटा को फेंक देता है?

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

यह बहुत परेशानी कुछ स्तंभ जोड़ने के लिए कुछ हार्ड-कोडेड ALTER तालिका कर नहीं है, लेकिन जब यह पूरा नया टेबल जोड़ने की बात आती है, यह सब है कि लिखने के लिए है करने के लिए मूर्खतापूर्ण लगता है ...

तो मेरी

  • वहाँ किसी भी तरह से कहीं कोड हाइबरनेट, और एक मेज बनाने के लिए एक वैध SQL क्वेरी वापस पाने के लिए एक इकाई वर्ग और एक बोली भेजने के लिए है: प्रश्न (रों) इस है?

  • और इससे भी बेहतर, किसी भी तरह से किसी तालिका में कॉलम जोड़ने के लिए SQL स्ट्रिंग बनाएं, बोली-सुरक्षित?

मुझे आशा है कि यह एक मूर्खतापूर्ण सवाल नहीं है, और मैं कुछ स्पष्ट याद नहीं है जब यह हाइबरनेट की बात आती है ...

उत्तर

2

मुझे नहीं लगता कि आप पूरी तरह से इस स्वचालित करने के लिए सक्षम हो जाएगा में एक उन्नत विधि है। Hibernate में hbm2ddl टूल (एक चींटी कार्य या एक मेवेन प्लगइन के रूप में उपलब्ध है) को आपके हाइबरनेट कॉन्फ़िगरेशन से आवश्यक डेटाबेस बनाने के लिए आवश्यक डीडीएल कथन उत्पन्न करने के लिए है, लेकिन मुझे किसी भी उपकरण से अवगत नहीं है जो दो के बीच स्वचालित "diff" कर सकता है संस्करणों। किसी भी मामले में आप शायद हाथ से सावधानीपूर्वक काम करने से बेहतर हो सकते हैं, क्योंकि केवल आप ही अपने ऑब्जेक्ट मॉडल को जानते हैं ताकि मौजूदा संस्थाओं के नए गुणों के लिए सही चूक चुन सकें।

एक बार जब आप अपने diffs को काम कर लेंगे तो आप उन्हें प्रबंधित करने के लिए liquibase जैसे टूल का उपयोग कर सकते हैं और वास्तव में एप्लिकेशन प्रारंभ समय पर डेटाबेस को अपडेट लागू कर सकते हैं।

+1

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

+1

दीपेश से इस उत्तर की जांच करें: http://stackoverflow.com/a/12259980/433789 – sdouglass

+1

हाइबरनेट को अपने स्वयं के ऑटो-अपडेट को सरल मामलों में अच्छी तरह से काम करना जैसे नए नलबल कॉलम जोड़ना, लेकिन यह अधिक जटिल से निपट नहीं सकता कॉलम का नाम बदलने या हटाने, प्रकार बदलने आदि जैसे प्रवासन की कल्पना करें। ऐसी स्थिति की कल्पना करें जहां आप एक नया कॉलम जोड़ रहे हैं जिसका मूल्य मौजूदा कॉलम में मानों के आधार पर गणना की आवश्यकता है (केवल मौजूदा डिफ़ॉल्ट पंक्तियों के लिए काम करने वाले स्थिर डिफ़ॉल्ट होने के बजाय)। –

2

शायद तुम एक अलग दृष्टिकोण की कोशिश करनी चाहिए। रनटाइम अपडेट पर स्कीमा उत्पन्न करने के चरण में, एक 'हाथ से' बनाएं (यद्यपि हाइबरनेट जेनरेट की गई स्क्रिप्ट पर आधारित हो सकता है)।

डेटाबेस में एक संस्करण संख्या स्टोर करें और प्रत्येक अगले संस्करण के लिए एक अद्यतन स्क्रिप्ट बनाएँ। केवल एक चीज जो आपको करना है वह यह निर्धारित करता है कि वर्तमान में कौन सा संस्करण डेटाबेस है और अनुक्रमिक रूप से आवश्यक संस्करण स्क्रिप्ट को वर्तमान संस्करण में लाने के लिए चलाता है।

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

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

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)

+1

साथ में सही फिट चाहिए मुझे लगता है मैं स्वीकार किए जाते हैं जवाब के रूप में इस ले जाएगा। अफसोस की बात है कि मुझे बकाया देने में अजीब लग रहा है क्योंकि यह वास्तव में मेरे प्रश्न का उत्तर नहीं है; और यह समाधान है कि मैं वापस गिरने पर योजना बना रहा था अगर मेरा प्रश्न वास्तव में असंभव समझा गया था। लेकिन मुझे लगता है कि यह अतिरिक्त निर्भरताओं और इसी तरह लाने के अपने विचारों के साथ सबसे नज़दीकी मिलान था। धन्यवाद – Stmated

+1

गंभीरता से, आपको Liquibase पर और विशेष रूप से इसके [हाइबरनेट समर्थन] (http://liquibase.org/manual/hibernate) पर एक अच्छा नज़र रखना चाहिए ... –

+1

मैंने किया; हालांकि दस्तावेज पढ़ने के दौरान मेरे खिलाफ कुछ आरक्षण था। बस इतना हो सकता है कि मैंने पूरी तरह से पर्याप्त नहीं पढ़ा, और यह नहीं पता कि मेरे पर्यावरण के साथ इसे कैसे मिलाएं। अगर चीजें बदलती हैं, तो संशोधित स्वीकृति के साथ वापस आ सकते हैं। – Stmated

4

आप की कोशिश की

hibernate.hbm2ddl.auto=update 

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

+1

यह मैं उपयोग करता हूं, यह बहुत अच्छा काम करता है। – sdouglass

2

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

Liquibase वसंत के माध्यम से शुरू किया जा सकता है, तो यह अपनी परियोजना ;-)