2014-08-27 6 views
5

के लिए इकाई वर्ग के नाम का उपयोग मैं LocationType नामित एक इकाई है नहीं दूँगी (BaseEntity एक @MappedSuperclass है):हाइबरनेट मुझे तालिका नाम

@Entity 
public class LocationType extends BaseEntity 

तालिका इस इकाई के लिए उत्पन्न नाम location_type है। मैं समझता हूं कि डिफ़ॉल्ट नामकरण रणनीति इस तरह काम करती है।

मैं क्या समझ में नहीं आता कि मैं क्यों, locationtype शाब्दिक नाम का उपयोग करने हाइबरनेट बाध्य नहीं कर सकता है। कोई फर्क नहीं पड़ता कि मुझे क्या करना:

@Entity(name = "LocationType") 
public class LocationType 

या

@Entity 
@Table(name = "LocationType") 
public class LocationType 

या

@Entity(name = "LocationType") 
@Table(name = "LocationType") 
public class LocationType 

तालिका नाम हमेशाlocation_type के रूप में समाप्त होता है। हाइबरनेट बस बेहतर जानता है!

अगर मैं किसी अन्य नाम

@Entity(name = "wtf") 

तो तालिका नाम के रूप में अच्छी तरह से wtf हो जाता है का उपयोग करें।

इस प्रलेखित व्यवहार है? मुझे एक बग की तरह लग रहा है।

इसी प्रकार के प्रश्न: Hibernate ignores @Table(name = "...") for extended classes - created tablenames are all lower case (यह, मानचित्रण विरासत को दर्शाता है)।

+0

हाइबरनेट किस संस्करण का उपयोग कर रहे हैं? क्या आप हाइबरनेट एनोटेशन या जावैक्स.परिस्टेंस एनोटेशन का भी उपयोग कर रहे हैं? – Vinc

+0

मैं नहीं आप hibernate.cfg.xml फ़ाइल में किसी भी विशिष्ट गुण और अपने सुपर वर्ग आदि की तरह कुछ और जानकारी पोस्ट मुद्दा beter को समझने के लिए कर सकते हैं अगर मैं 'का उपयोग javax.persistence.Entity' किसी भी मुद्दे दिख रहा है,। – Chaitanya

+0

दोनों @Entity और @Table '' से javax.persistence'' हैं। हाइबरनेट संस्करण 4.3.1 है। – MaDa

उत्तर

1

यह मेरे लिए अजीब लग रहा था कि हाइबरनेट का पालन नहीं करता है @Table(name="...") annnotation में निर्दिष्ट किया जाता है, इसलिए मैं इस बग रिपोर्ट, अब तक 9 साल की उम्र तक खोदा:

NamingStrategy should not be used when table or column name is supplied

बग को खारिज कर दिया गया था, भगवान और गेविन किंग को पता था क्यों (या शायद यह सिर्फ भगवान है)। यह जेपीए 1/2 विनिर्देशों के विपरीत है। अंतिम जवाब, इस प्रकार है: यह है कि कैसे हाइबरनेट बॉक्स से बाहर काम करता है; अगर अगर आप अपनी टिप्पणी के नाम प्रिय (या जेपीए अनुपालन) पकड़, आप अपने खुद के नामकरण रणनीति इस मोड़ ठीक करने के लिए लागू करना चाहिए।

2

डॉक्स में एक नज़र यहाँ है।

ImprovedNamingStrategy

Implementing a NamingStrategy

यह org.hibernate.cfg.ImprovedNamingStrategy के व्यवहार, जो एम्बेडेड रेखांकित नाम करने के लिए मिश्रित केस के नाम परिवर्तित कर देगी। http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/cfg/ImprovedNamingStrategy.html। इसलिए यदि आप स्पष्ट रूप से "EventLog" नाम का उपयोग करते हैं, तो यह "event_log" में परिवर्तित हो जाएगा।

आप बस स्पष्ट रूप से @Table में निर्दिष्ट नाम का उपयोग करना चाहते हैं, तो आप org.hibernate.cfg.DefaultNamingStrategy उपयोग करना चाहिए। डिफ़ॉल्ट रूप से यह प्रयोग किया जाता है जब आप अपने org.hibernate.cfg.Configuration वस्तु

का दृष्टांत आप उन जो एक नाम निर्दिष्ट स्पष्ट रूप से आप नीचे दिए गए उपवर्ग उपयोग कर सकते हैं के अलावा सभी तालिकाओं के लिए ImprovedNamingStrategy का उपयोग करना चाहते हैं। columnName और TableName तरीकों, लोगों को जब एक नाम स्पष्ट रूप से निर्दिष्ट किया जाता है कहा जाता है इस उपवर्ग निर्दिष्ट नाम unmolested छोड़ देता है।

public class RespectfulImprovedNamingStrategy extends ImprovedNamingStrategy 
{ 
    @Override 
    public String columnName(String columnName) 
    { 
     return columnName; 
    } 

    @Override 
    public String tableName(String tableName) 
    { 
     return tableName; 
    } 

    @Override 
    public String classToTableName(String className) { 
    return addUnderscores(StringHelper.unqualify(className)); 
    } 
} 

संदर्भ के लिए और अधिक लिंक।

link1

link2

+1

किस तरह से यह एक स्पष्ट नाम एनोटेशन में दी गई साथ नामकरण रणनीति अधिभावी की असंभावना से संबंधित है, प्रश्न में वर्णित के रूप? – MaDa

+0

@ मादा उत्तर कुछ समाधान के साथ संपादित किया गया –

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