वसंत में वसंत काम कैसे करता है। jpa.hibernate.ddl- ऑटो संपत्ति बिल्कुल काम करती है।


129

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

तब मुझे ध्यान आया कि मैंने spring.jpa.hibernate.ddl-autoअपनी संपत्ति फ़ाइल में निर्दिष्ट नहीं की है । मैंने कुछ शोध किए और पाया कि इसे spring.jpa.hibernate.ddl-auto= create-dropविकास में जोड़ने की सिफारिश की गई है। और इसे बदलने के लिए: spring.jpa.hibernate.ddl-auto= noneउत्पादन में।

लेकिन मुझे वास्तव में समझ नहीं आया कि यह वास्तव में कैसे काम करता है और कैसे हाइबरनेट डेटाबेस स्कीमा का उपयोग create-dropया noneमूल्य उत्पन्न करता है । क्या आप तकनीकी रूप से बता सकते हैं कि यह वास्तव में कैसे काम करता है, और विकास में और उत्पादन सर्वर पर इस संपत्ति का उपयोग करने के लिए क्या सिफारिशें हैं। धन्यवाद


1
FWIW JPA 2.1 में एक मानक संपत्ति javax.persistence.schema-generation.database.action है, ताकि वास्तव में स्कीमा पीढ़ी के लिए JPA विक्रेता विशिष्ट गुणों का उपयोग करने की आवश्यकता न दिखे।
नील स्टॉकटन

@NeilStockton एक विचार जो हम हाइबरनेट 6 के साथ खोज रहे हैं, वह विभिन्न श्रेणियों के आधार पर स्कीमा पीढ़ी को नियंत्रित करने में सक्षम होने की क्षमता है; उदाहरण के लिए आपकी ओआरएम टेबल हो सकती हैं, noneलेकिन आप चाहते हैं कि आपके हाइबरनेट सर्च और एनवर्स टेबल का उपयोग कर उत्पन्न किया जाए updateक्योंकि वे आंतरिक रूप से उन परियोजनाओं द्वारा प्रबंधित होते हैं और आप स्वयं उन लोगों को प्रबंधित नहीं करना चाहते हैं। अभी हम सभी वैश्विक रूप से उनकी उत्पत्ति / स्रोत की परवाह किए बिना सभी तालिकाओं पर नियंत्रण रखते हैं। यदि आप इसका उपयोग करना चाहते हैं तो यह विक्रेता-विशिष्ट विकल्पों का उपयोग करने का कारण होगा।
15

जवाबों:


215

रिकॉर्ड के लिए, spring.jpa.hibernate.ddl-autoसंपत्ति स्प्रिंग डेटा जेपीए विशिष्ट है और यह एक मूल्य निर्दिष्ट करने का उनका तरीका है जो अंततः उस संपत्ति के तहत हाइबरनेट को पारित किया जाएगा, जिसे वह जानता है hibernate.hbm2ddl.auto

मूल्यों create, create-drop, validate, और updateमूल रूप से प्रभावित करते हैं कैसे स्कीमा उपकरण प्रबंधन स्टार्टअप पर डेटाबेस स्कीमा में हेरफेर होगा।

उदाहरण के लिए, updateऑपरेशन डेटाबेस मेटाडेटा प्राप्त करने के लिए JDBC ड्राइवर के एपीआई को क्वेरी करेगा और फिर हाइबरनेट आपके एनोटेट कक्षाओं या एचबीएम एक्सएमएल मैपिंग पढ़ने के आधार पर बनाए गए ऑब्जेक्ट मॉडल की तुलना करता है और स्कीमा को मक्खी पर समायोजित करने का प्रयास करेगा।

updateउदाहरण के लिए आपरेशन नए कॉलम, बाधाओं, आदि जोड़ने का प्रयास करेगा लेकिन एक स्तंभ या बाधा है कि पहले से ही अस्तित्व में हो सकता है लेकिन अब एक पूर्व रन से ऑब्जेक्ट मॉडल के भाग के रूप में करता हटाने कभी नहीं होगा।

आमतौर पर परीक्षण के मामले में परिदृश्य, आप संभावना का उपयोग करेंगे create-dropताकि आप अपना स्कीमा बनाएं, आपका परीक्षण मामला कुछ नकली डेटा जोड़ता है, आप अपने परीक्षण चलाते हैं, और फिर परीक्षण के मामले में सफाई के दौरान, स्कीमा ऑब्जेक्ट को खाली डेटाबेस छोड़ दिया जाता है।

विकास में, डेवलपर्स updateको पुनरारंभ करने पर नए परिवर्धन को जोड़ने के लिए स्कीमा को स्वचालित रूप से संशोधित करने के लिए उपयोग करना अक्सर सामान्य होता है । लेकिन फिर से समझते हैं, यह एक स्तंभ या बाधा को नहीं हटाता है जो पिछले निष्पादन से मौजूद हो सकता है जो अब आवश्यक नहीं है।

उत्पादन में, यह अक्सर आपके द्वारा उपयोग की जाने वाली noneया इस संपत्ति को निर्दिष्ट नहीं करने की अत्यधिक अनुशंसा की जाती है। ऐसा इसलिए है क्योंकि डीबीए के लिए डेटाबेस परिवर्तन के लिए माइग्रेशन स्क्रिप्ट की समीक्षा करना आम बात है, खासकर यदि आपका डेटाबेस कई सेवाओं और अनुप्रयोगों में साझा किया जाता है।


11
हाँ, उत्पादन में कभी भी ddl पीढ़ी का उपयोग न करें। हम ddl का उपयोग करके तालिका संरचना के लिए प्रारंभिक स्क्रिप्ट तैयार करते हैं, और प्रक्रिया में DBA को शामिल करते हैं। उसके बाद हम परिनियोजन इकाई के भाग के रूप में db स्क्रिप्ट को शामिल करते हैं, और जब अनुप्रयोग तैनात किया जाता है तो वे फ्लाईवे का उपयोग करके निष्पादित करते हैं। जब हमें डेटाबेस को संशोधित करने की आवश्यकता होती है, तो हम एप्लिकेशन के अगले संस्करण में नई स्क्रिप्ट जोड़ते हैं और स्टेजिंग के लिए तैनात होते हैं। फ्लाईवे स्वचालित रूप से वर्तमान संस्करण का पता लगाएगा और डेटाबेस को नवीनतम संस्करण में लाने के लिए आवश्यक स्क्रिप्ट चलाएगा। अगर सब कुछ काम करता है तो हम उत्पादन के लिए तैनात करते हैं।
क्लॉस ग्रोएनबैक

1
क्या होगा अगर हम इस संपत्ति को निर्दिष्ट नहीं करते हैं? उदाहरण के लिए मेरे पास अपनी <bean id = "sessionFactory" वर्ग = "org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <प्रोप कुंजी = "hibernate.bm2ddl.auto"> अद्यतन </ Prop> मेरे पास यह है। और किसी कारण से मेरे टेबल को हमेशा के लिए छोड़ दिया गया, जब तक कि मैंने उपर्युक्त संपत्ति नहीं जोड़ी ;; ps: कोड नमूने के लिए खेद है)
sorrygan Ion

11
validateप्रोडक्शन एनव में क्यों नहीं ?
शामल करुणारत्ने

20
@ShamalKarunarathne एप्लिकेशन validateउत्पादन में उपयोग कर सकते हैं , लेकिन आम तौर पर यह सुनिश्चित करने के लिए कि आपके द्वारा अपने डेटाबेस माइग्रेशन टूल पर लिखी गई या लागू की गई डेटाबेस स्क्रिप्ट सटीक हैं, यह सत्यापित करने के लिए आपके द्वारा उपयोग की जाने वाली सेटिंग होनी चाहिए। validateउत्पादन में उपयोग नहीं करने का एक और कारण यह है कि यह आपके आवेदन की स्टार्टअप प्रक्रिया के दौरान एक अड़चन हो सकता है, खासकर अगर आपका ऑब्जेक्ट मॉडल आकार में काफी व्यापक है या यदि अन्य नेटवर्क से संबंधित कारक खेल में आते हैं।
20

1
एक सटीक स्टैक के बिना सट्टा करने के लिए इसकी कड़ी ट्रेस; हालाँकि, मेरा पहला अनुमान यह होगा कि orderSQL पार्सर द्वारा गलत तरीके से व्याख्या की जा रही है क्योंकि यह एक कीवर्ड है यदि इसे नहीं छोड़ा जा रहा है।
नूर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.