2010-06-15 18 views
24

के लिए कॉलम नामों में एक उपसर्ग जोड़ें, मैं एक प्रोजेक्ट विकसित कर रहा हूं जिसमें मैं कुछ पीओजेओ को हाइबरनेट एनोटेशन जोड़कर बना रहा हूं। एक समस्या जो मैं चल रहा हूं वह यह है कि इस तरह का कोड विफल रहता है, क्योंकि हाइबरनेट Time_T के भीतर उसी कॉलम पर उप-फ़ील्ड को मैप करने का प्रयास करता है (यानी startTime.sec और stopTime.sec दोनों कॉलम sec पर मैप करने का प्रयास करते हैं, जिससे त्रुटि होती है)।स्वचालित रूप से @Embeddable क्लासेस

@Entity 
public class ExampleClass 
{ 
    @Id 
    long eventId; 

    Time_T startTime; 
    Time_T stopTime; 
} 

@Embeddable 
public class Time_T 
{ 
    int sec; 
    int nsec; 
} 

के रूप में वहाँ प्रणाली में इस तरह पाया जाना हो जाएगा, यह अगर वहाँ स्वचालित रूप से स्तंभ नाम के एक उपसर्ग संलग्न करने के लिए एक विकल्प था अच्छा होगा (जैसे बनाने के कॉलम startTime_sec, startTime_nsec, stopTime_sec, stopTime_nsec हो), प्रति फ़ील्ड आधार पर ओवरराइड लागू किए बिना। क्या हाइबरनेट में यह क्षमता है, या क्या कोई अन्य उचित कार्य है?

+0

शायद धागा निम्नलिखित उत्तर है: http://stackoverflow.com/questions/331744/jpa-multiple-embedded-fields –

उत्तर

21

org.hibernate.cfg.DefaultComponentSafeNamingStrategy

+5

हाइबरनेट 5 एक अंतर्निहित भाग में नामकरण रणनीति विभाजित (जब कोई स्पष्ट कॉलम ओवरराइड नहीं दिया जाता है) और एक भौतिक भाग, जो कॉलम एनोटेशन के साथ स्पष्ट रूप से परिभाषित किए जाने पर भी किसी भी नामकरण को ओवरराइड करता है। एक डिफ़ॉल्ट अंतर्निहित नामकरण उपलब्ध रणनीति है, जो कक्षाओं एम्बेडेड उपसर्गों है: 'hibernate.implicit_naming_strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl' भी देखें [हाइबरनेट प्रलेखन] [1] अधिक जानकारी के के लिए [1]: https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/domain/naming.html –

+0

क्या होगा यदि मैं पहले से ही एक कस्टम नामकरण रणनीति का उपयोग कर रहा हूं? क्या इस रणनीति से किसी विधि के साथ ओवरराइड करने के लिए कोई विशिष्ट विधि है? –

4

को समस्या का समाधान करने के लिए एक और तरीका है संपत्ति hibernate.ejb.naming_strategy सेट करने का प्रयास @AttributeOverrides और @AttributeOverride एनोटेशन का उपयोग कर रहा है। आपके उदाहरण में Time_T.sec संपत्ति sec कॉलम पर मैप की गई है। आप ExampleClass इस तरह से मैप कर सकते:

@Entity 
public class ExampleClass { 
    @Id 
    long eventId; 

    @AttributeOverrides(
     @AttributeOverride(name = "sec", column = @Column(name = "start_sec")) 
    ) 
    Time_T startTime; 
    Time_T stopTime; 
} 

परिणाम मानचित्रण startTime.sec <=> start_sec और stopTime.sec <=> sec है। बेशक आप stopTipe.sec कॉलम के लिए अधिक सार्थक नाम बनाने के लिए एनोटेशन का उपयोग कर सकते हैं।

+2

यह स्पष्ट रूप से मैं नहीं करना चाहता हूं, क्योंकि पूरे कोड में इस पैटर्न के कई उदाहरण हो सकते हैं। मैं '@ AttributeOverrides' एनोटेशन में कई सौ बार जोड़ना नहीं चाहता हूं। – VeeArr

+0

मुझे खेद है, मैंने आपके पहले संदेश पर पर्याप्त ध्यान नहीं दिया था। आपने स्पष्ट रूप से कहा है कि आप फ़ील्ड मैन्युअल रूप से ओवरराइड नहीं करना चाहते थे। –

5

org.hibernate के साथ मेरे मामले में: हाइबरनेट-कोर: 5.0.12. फ़ाइनल और org.springframework.boot: वसंत-बूट-स्टार्टर-डेटा-जेपीए: 1.5.2.RELEASE मुझे निम्नलिखित गुण करना था मेरी application.properties फ़ाइल में:

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl 
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 
संबंधित मुद्दे