2017-01-28 9 views
7

यह मुझे पागल कर रहा है।स्प्रिंग बूट हाइबरनेट 5 अनदेखा @Table और @ कॉलम

मैं स्प्रिंग सोशल को कार्यान्वित कर रहा हूं और इसके लिए आपको UserConnection नामक डेटाबेस तालिका की आवश्यकता है (दो शब्दों को अलग करने के लिए अंडरस्कोर का उपयोग करने के मानक नामकरण सम्मेलन का उपयोग करने के बजाय)।

तो मेरे बेवकूफ दुनिया के दृश्य में, मुझे लगता है कि @Table(name="UserConnection") निर्दिष्ट करके इसे आसानी से हल किया जाएगा ... लेकिन नहीं, यह सब बहुत आसान होगा।

एनोटेशन को अनदेखा किया जाता है और तालिका user_connection के रूप में बनाई गई है जो तब स्प्रिंग सोशल को अपना फिट करने का कारण बनती है।

कृपया मुझे बताएं कि मेरे स्प्रिंग बूट ऐप को केवल एक टेबल (और इसके संबंधित कॉलम) को मानक एक के बजाय ऊंट-केस नामकरण सम्मेलन का उपयोग करने के लिए कहने का कुछ आसान तरीका है।

+0

कैसे आप अपने ऑटो DDL निर्माण कॉन्फ़िगर करूँ? –

+0

भी अच्छा होगा यदि आप एप्लिकेशन में शामिल करते हैं .properties और proerties जो आप सत्र में जोड़ते हैं फैक्टरी –

उत्तर

5

टीएल;

spring: 
    jpa: 
    hibernate: 
     naming: 
     physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

या अपने application.properties: डॉ


अपने application.yml फ़ाइल में निम्न जोड़ें

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

विस्तृत जवाब

स्प्रिंग बूट के रूप में 1.4 release notes कहता है:

SpringNamingStrategy अब हाइबरनेट 5.1 के रूप में उपयोग नहीं किया गया है पुराने NamingStrategy इंटरफ़ेस के लिए समर्थन हटा दिया गया है। एक नया SpringPhysicalNamingStrategy अब स्वत: कॉन्फ़िगर किया गया है जिसका उपयोग में हाइबरनेट के डिफ़ॉल्ट ImplicitNamingStrategy के साथ संयोजन में किया जाता है। यह स्प्रिंग बूट 1.3 डिफ़ॉल्ट के बहुत करीब (यदि समान नहीं है) होना चाहिए, हालांकि, आपको अपग्रेड करते समय अपनी डेटाबेस स्कीमा सही सही जांचनी चाहिए।

यह नया PhysicalNamingStrategy स्प्रिंग अनुशंसित नामकरण सम्मेलनों का पालन करता है। वैसे भी यदि आप भौतिक नामकरण पर कुल नियंत्रण चाहते हैं, तो आप org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl का उपयोग बंद कर सकते हैं। आप अपने application.yml के लिए निम्न जोड़कर कि नामकरण रणनीति के लिए स्विच कर सकते हैं:

spring: 
    jpa: 
    hibernate: 
     naming: 
     physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 

एनोटेशन नजरअंदाज कर दिया है और मेज user_connection जो तब स्प्रिंग सामाजिक का कारण बनता है एक hissy फिट करने के लिए के रूप में बनाया जाता है।

private Identifier apply(Identifier name, JdbcEnvironment jdbcEnvironment) { 
    if (name == null) { 
     return null; 
    } 
    StringBuilder builder = new StringBuilder(name.getText().replace('.', '_')); 
    for (int i = 1; i < builder.length() - 1; i++) { 
     if (isUnderscoreRequired(builder.charAt(i - 1), builder.charAt(i), 
       builder.charAt(i + 1))) { 
      builder.insert(i++, '_'); 
     } 
    } 
    return getIdentifier(builder.toString(), name.isQuoted(), jdbcEnvironment); 
} 

private boolean isUnderscoreRequired(char before, char current, char after) { 
    return Character.isLowerCase(before) && Character.isUpperCase(current) 
      && Character.isLowerCase(after); 
} 

यह मूल रूप से एक अंडरस्कोर के साथ किसी भी . और मामले परिवर्तन (isUnderscoreRequired विधि पर एक नज़र डालें) को बदल देता है:

SpringPhysicalNamingStrategy की apply विधि इस व्यवहार को समझने के लिए महत्वपूर्ण है।

+0

मैंने कई चीजों की कोशिश की, मैंने ट्रैक खो दिया है। मेरा मानना ​​है कि जब मैंने इस विधि का उपयोग किया था, तो अन्य सभी टेबल और कॉलम जिन्हें अंडरस्कोर का उपयोग करने के रूप में स्पष्ट रूप से मैप नहीं किया गया था, ऊंट-केस का उपयोग करके पुनर्निर्मित किए गए थे। इसलिए अनिवार्य रूप से, यदि मैं इस दृष्टिकोण का उपयोग करता हूं, तो मुझे प्रत्येक कॉलम और टेबल से गुज़रना होगा और अंडरस्कोर नोटेशन के साथ उन्हें ओवरराइड करने वाली टिप्पणियां जोड़नी होंगी। – Trevor

+0

हाँ मैंने अभी इसका परीक्षण किया है और जैसा कि मैंने ऊपर बताया है वैसा ही व्यवहार करता है। सभी टेबल और कॉलम जिन्हें स्पष्ट रूप से @ कॉलम और @Table के साथ नामित नहीं किया गया है, डीबी में ऊंट-केस के रूप में बनाए जाएंगे। यह बेकार है क्योंकि मैं सटीक विपरीत प्रभाव चाहता हूँ। मैं केवल इस बेवकूफ 'UserConnection' तालिका को स्पष्ट रूप से मैप करना चाहता हूं, न कि मेरी सभी अन्य टेबल और कॉलम। – Trevor

+0

@Trevor तो आपको अपना 'ImplicitNamingStrategy' –

0

विकल्प सभी का 1

पहले @Entity मानचित्रण पर स्थित अपनी तालिकाओं नाम निर्धारित:

@Entity(name = "UserConnections") 
public class UserConnection{ 

विकल्प 2

आप NamingStrategy साथ एक सा देना चाहिए। जब आप sessionFactory सेम के लिए अपनी संपत्ति को परिभाषित तो यह जोड़ने का प्रयास करें:

<prop key="hibernate.implicit_naming_strategy">legacy-jpa</prop> 

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

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

विकल्प 3

वैकल्पिक रूप से अगर इसके बाद के संस्करण आप के लिए काम नहीं करते हैं, तो आप PhysicalNamingStrategy उपयोग करना होगा। हालांकि इस मामले में अपने अंतिम उपाय है:

संदर्भ: https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/domain/naming.html

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