2009-02-05 18 views
7

डेटा प्राप्त करने के लिए मुझे प्राप्त हो रहा है मुझे यह सुनिश्चित करने की आवश्यकता है कि लंबाई डेटाबेस कॉलम की लंबाई से अधिक नहीं जा रही है। अब सभी लंबाई की जानकारी हाइबरनेट मैपिंग फाइलों में संग्रहीत है, क्या इस जानकारी को प्रोग्रामेटिक रूप से एक्सेस करने के लिए वैसे भी है?हाइबरनेट मैपिंग से कॉलम की लंबाई प्राप्त करना?

+0

इस समस्या के जेपीए समाधान के लिए http://stackoverflow.com/questions/1816780/ भी देखें। –

उत्तर

6

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

for (Iterator iter=configuration.getClassMappings(); iter.hasNext();) { 
    PersistentClass persistentClass = (PersistentClass)iter.next(); 
    for (Iterator iter2=persistentClass.getPropertyIterator(); iter2.hasNext();) { 
     Property property = (Property)iter2.next(); 
     String class = persistentClass.getClassName(); 
     String attribute = property.getName(); 
     int length = ((Column)property.getColumnIterator().next()).getLength(); 
    } 
    } 
+0

मुझे यह कोशिश करनी होगी, धन्यवाद ब्रायन। –

6

ब्रायन के उत्तर के आधार पर, मैं यही कर रहा हूं।

private static final Configuration configuration = new Configuration().configure(); 

public static int getColumnLength(String className, String propertyName) { 
    PersistentClass persistentClass = configuration.getClassMapping(className); 
    Property property = persistentClass.getProperty(propertyName); 
    int length = ((Column) property.getColumnIterator().next()).getLength(); 

    return length; 
} 

ऐसा लगता है कि यह अच्छी तरह से काम कर रहा है। उम्मीद है कि यह किसी भी व्यक्ति के लिए सहायक होगा जो इस प्रश्न पर ठोकर खाता है।

+0

हाइबरनेट 5 के साथ इस तरह पर्सिस्टेंट क्लास प्राप्त करें (कॉन्फ़िगरेशन के माध्यम से): 'मानक सेवा रजिस्ट्री मानक रजिस्ट्री = नया मानक सेवा रजिस्ट्रीबिल्डर()। कॉन्फ़िगर करें (" hibernate.cfg.xml ")। Build(); मेटाडाटा मेटाडेटा = नया मेटाडेटा स्रोत (मानक रजिस्ट्री) .getMetadatabuilder()। Build(); सूची persistentClasses = new ArrayList (metaData.getEntityBindings()); ' – olivmir

1

कभी-कभी कॉन्फ़िगरेशन ऑब्जेक्ट प्राप्त करने में समस्या हो सकती है (यदि आप कुछ एप्लिकेशन ढांचे का उपयोग कर रहे हैं और आप कॉन्फ़िगरेशन का उपयोग करके स्वयं सत्र सत्र बना रहे हैं)।

यदि आप उदाहरण के लिए वसंत का उपयोग कर रहे हैं, तो आप कॉन्फ़िगरेशन ऑब्जेक्ट प्राप्त करने के लिए LocalSessionFactoryBean (अपने एप्लिकेशन कॉन्टेक्स्ट से) का उपयोग कर सकते हैं। तब स्तंभ लंबाई के प्राप्त करने के केक का सिर्फ टुकड़ा है;)

factoryBean.getConfiguration().getClassMapping(String entityName) .getTable().getColumn(Column col).getLength() 
1

हालांकि, जब मैं LocalSessionFactoryBean तक पहुँचने का प्रयास, मैं एक वर्ग डाली अपवाद ले

LocalSessionFactoryBean factoryBean = (LocalSessionFactoryBean) WebHelper.instance().getBean("sessionFactory"); 

अपवाद:

org.hibernate.impl.SessionFactoryImpl cannot be cast to org.springframework.orm.hibernate3.LocalSessionFactoryBean 

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean> 

यह दुर्भाग्यपूर्ण लगता है ....

संपादित करें: उत्तर मिला। आप सेम नाम स्ट्रिंग के सामने एक ampersand उपयोग करने की आवश्यकता

LocalSessionFactoryBean factoryBean = (LocalSessionFactoryBean) WebHelper.instance().getBean("&sessionFactory"); 

see this Spring forum post

3

मेरे पसंदीदा विकास पैटर्न एक निरंतर पर स्तंभ लंबाई, जो आसानी से संदर्भित किया जा सकता आधार पर है:

class MyEntity { 
    public static final int FIELD_LENGTH = 500; 

    @Column(length = FIELD_LENGTH) 
    String myField; 

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