हाइबरनेट hbm2ddl.auto कॉन्फ़िगरेशन के संभावित मूल्य क्या हैं और वे क्या करते हैं


1084

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

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

  • नई टेबल
  • पुराने टेबलों में नए कॉलम
  • कॉलम हटा दिए गए
  • स्तंभ का डेटा प्रकार बदल गया
  • एक प्रकार के कॉलम ने अपनी विशेषताओं को बदल दिया
  • टेबल गिरा दी गई
  • एक कॉलम के मूल्य बदल गए

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

जवाबों:


1082

से समुदाय प्रलेखन :

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

जैसे मान्य | अद्यतन | बनाएँ | बनाने ड्रॉप

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

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

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


14
मान्य मानों के लिए सिर्फ़ हाइबरनेट फ़ोरम पढ़ें ... यह कहता है: "उदा" ... क्या कोई अन्य मान्य मूल्य हैं?
ता सास

16
मुझे लगता है कि यह "उदा" कहता है क्योंकि यह सिर्फ एक सामुदायिक दस्तावेज है, अगर किसी को सभी संभावित मूल्यों में दिलचस्पी है, तो यह हाइबरनेट के जेवाडॉक में पाया जा सकता है। (और हाँ, केवल उन चार विकल्प मौजूद हैं) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/...
Szegedi

4
मान्य कहता है कि स्कीमा को मान्य करें, इसका वास्तव में क्या मतलब है ??
हुसैन अख्तर वाहिद 'घौरी'

6
यदि आप हाइबरनेट को कुछ नहीं करना चाहते हैं, तो आप 'एर्डवार्क', या 'कबूतर' या किसी अन्य शब्द का भी उपयोग कर सकते हैं। ऐसा नहीं है कि मैं निश्चित रूप से सिफारिश करेंगे!
वार्ड

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

194

इसे पूरी तरह से निष्क्रिय करने के लिए "कोई भी नहीं" का अविवादित मूल्य भी है।


7
यह वास्तव में काफी उपयोगी है क्योंकि हाइबरनेट की स्कीमा मान्यता कभी-कभी पूरी तरह से मान्य स्कीमा के लिए विफल हो जाती है।
माइकल पिफेल

मैं बस ऐसे ही कुछ माँगने वाला था। मेरा इरादा स्टार्टअप टाइम को कम करना है।
डिगाओ_मब

46
'खाली स्ट्रिंग ’' कोई नहीं’ से बेहतर है । 'कोई नहीं' का उपयोग करने के लिए, आपको चेतावनी संदेश प्राप्त होगा: org.hibernate.cfg.SettingsFactory - "hibernate.hbm2ddl.auto" के लिए अपरिचित मूल्य: कोई नहीं
614 को okwap करें

14
मैंने इसे पैच कर दिया है। एक स्पष्ट रूप से मान्य स्थिरांक के रूप में "कोई नहीं" जोड़ा गया।
Sanne

9
मैं की तरह "hibernate.hbm2ddl.auto = आलू" दूसरों पर stackoverflow.com/a/15810379/838444
Sneg

161

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

हमारे विकास के माहौल में हम hibernate.hbm2ddl.auto=create-dropहर बार जब हम तैनात करते हैं तो एक साफ डेटाबेस बनाने और छोड़ने के लिए सेट करते हैं, ताकि हमारा डेटाबेस एक ज्ञात स्थिति में हो।

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

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


5
दरअसल, दस्तावेज़ीकरण के अनुसार, निर्माण-ड्रॉप डेटाबेस टेबल बनाता है और सत्र कारखाना बंद होने पर उन्हें छोड़ देता है। सत्र कारखाना बनाए जाने पर यह तालिकाओं को नहीं गिराता है।
Frans

4
नहीं, दोनों सेफ़-ड्रॉप बनाते हैं और ड्रॉप-टेबल बनाते हैं जब सेन्फ़ैक्टेबिलिटी बनाई जाती है, तो से-ड्रॉप ड्रॉप्स टेबल को भी छोड़ देता है, जब सेन्फ्रंक्टीविटी बंद हो जाती है। देखें stackoverflow.com/a/6752698/1536382
Testo Testini

क्या hibernate.hbm2ddl.auto बनाना = उत्पादन में गिरावट से उत्पादन में कई कनेक्शन समयबाह्य हो सकते हैं?
METTAIBI

51

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


6
क्यों आप उत्पादन के लिए hbm2ddl का उपयोग नहीं करना चाहिए के लिए stackoverflow.com/questions/221379/… देखें ।
नाथन वोक्सलैंड 7

51

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

hibernate.hbm2ddl.auto

प्रलेखन के अनुसार इसके चार मान्य मूल्य हो सकते हैं:

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

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

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

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

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

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

    -यदि स्कीमा DB में मौजूद है: - स्कीमा को अद्यतन करें।


यह वास्तव में एक बहुत ही महत्वपूर्ण बिंदु है कि स्कीमा बनाया जाएगा यदि यह मौजूद नहीं है, जब "अपडेट" का उपयोग किया जाता है।
युरानोस

"व्यवहार के स्पष्टीकरण" और "महत्वपूर्ण बिंदुओं" बयानों की तुलना करते समय क्रिएट-ड्रॉप का विरोधाभास होता है।
VNT

2
अपडेट और खाली के बीच क्या अंतर है ?
yashjain12yj

46

सबसे पहले, hbm2ddlविन्यास संपत्ति के लिए संभावित मान निम्नलिखित हैं:

  • none- कोई कार्रवाई नहीं की जाती है। स्कीमा उत्पन्न नहीं किया जाएगा।
  • create-only - डेटाबेस स्कीमा उत्पन्न किया जाएगा।
  • drop - डेटाबेस स्कीमा को छोड़ दिया जाएगा और बाद में बनाया जाएगा।
  • create - डेटाबेस स्कीमा को छोड़ दिया जाएगा और बाद में बनाया जाएगा।
  • create-drop- डेटाबेस स्कीमा को छोड़ दिया जाएगा और बाद में बनाया जाएगा। को बंद करने पर SessionFactory, डेटाबेस स्कीमा को छोड़ दिया जाएगा।
  • validate - डेटाबेस स्कीमा को इकाई मैपिंग का उपयोग करके मान्य किया जाएगा।
  • update - डेटाबेस स्कीमा को मौजूदा डेटाबेस स्कीमा की इकाई मैपिंग के साथ तुलना करके अपडेट किया जाएगा।

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

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

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


27

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

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

  • create - एक स्कीमा बनाना

    <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">

2
क्या के बारे में <प्रविष्टि कुंजी = "hibernate.hbm2ddl.auto" मूल्य = "कोई नहीं">?
VNT

17

यदि आप अपने ऐप में स्ट्रिंग्स का उपयोग नहीं करना चाहते हैं और पूर्वनिर्धारित स्थिरांक की तलाश कर रहे हैं तो org.hibernate.cfg.AvailableSettingsहाइबरनेट जार में शामिल वर्ग पर एक नज़र है , जहां आपको सभी संभव सेटिंग्स के लिए एक निरंतर मिलेगा। आपके मामले में उदाहरण के लिए:

/**
 * Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
 * <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
 */
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";

5
लगभग 500 वॉट अप के साथ सीधे उत्तर के ऊपर 700+ लाइनों लंबी स्रोत फ़ाइल का संदर्भ क्यों है?
पावेल निदोबा

... उस सवाल का कोई मतलब नहीं है। बातें क्यों हैं? मैं अभी भी यहां क्यों हूं?
specializt

8
  • validate: स्कीमा को मान्य करता है, डेटाबेस में कोई परिवर्तन नहीं होता है।
  • update: वर्तमान निष्पादन क्वेरी के साथ स्कीमा को अद्यतन करता है।
  • create: हर बार नया स्कीमा बनाता है, और पिछले डेटा को नष्ट कर देता है।
  • create-drop: स्कीमा ड्रॉप हो जाता है जब अनुप्रयोग बंद हो जाता है या सेशनफैक्टरी स्पष्ट रूप से बंद हो जाती है।

व्हाट्सएप 'आधिकारिक' प्रलेखन संदर्भ? - बस सोच रहा था ...
डर्क शूमाकर

7

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

SchemaExport Class 

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

चेकआउट [स्कीमाएक्सपोर्ट]


4

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

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


3

5.0 के बाद से , अब आप उन मूल्यों को एक समर्पित में पा सकते हैं Enum: org.hibernate.boot.SchemaAutoTooling( NONE5.2 से मूल्य के साथ बढ़ाया गया )।

या इससे भी बेहतर, 5.1 के बाद , आप जेपीए 2 और "लीगेसी" हाइबरनेट डीडीएल कार्यों को जोड़ती है , जो भी उपयोग कर सकते हैं ।org.hibernate.tool.schema.Action Enum

लेकिन , आप अभी तक इसके DataSourceसाथ प्रोग्रामेटिक रूप से कॉन्फ़िगर नहीं कर सकते हैं । इसे संयुक्त रूप से उपयोग करने के लिए अच्छा होगा, org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTOलेकिन वर्तमान कोड एक Stringमूल्य (से लिया गया अंश SessionFactoryBuilderImpl) की उम्मीद करता है :

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

... और enumदोनों के आंतरिक मूल्य org.hibernate.boot.SchemaAutoToolingऔर org.hibernate.tool.schema.Actionसार्वजनिक रूप से उजागर नहीं होते हैं।

यहाँ, एक नमूना प्रोग्रामेटिक DataSourceकॉन्फ़िगरेशन (मेरे स्प्रिंग बूट अनुप्रयोगों में से एक में प्रयुक्त) जो एक धन्यवाद का उपयोग .name().toLowerCase()करता है, लेकिन यह केवल डैश के बिना मूल्यों के साथ काम करता है ( create-dropउदाहरण के लिए नहीं ):

@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {

    Map<String, Object> properties = new HashMap<>();
    properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
    properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());

    return builder
            .dataSource(internalDataSource)
            .packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
            .persistenceUnit(PERSISTENCE_UNIT_NAME)
            .properties(properties)
            .build();
}

0

किसके लिए डिफ़ॉल्ट मान खोजता है ...

यह स्प्रिंग-बूट के संस्करण 2.0.5 पर स्रोत कोड में और JpaProperties पर 1.1.0 में लिखा गया है:

    /**
     * DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
     * property. Defaults to "create-drop" when using an embedded database and no
     * schema manager was detected. Otherwise, defaults to "none".
     */
    private String ddlAuto;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.