2010-05-27 19 views
6

में स्तंभ नाम जाओ मैं एक प्रश्न कारखाने उस कॉलम के लिए खोज करने के क्रम में एक विशेषता के रूप में एक स्तंभ नाम लेता है। अभी मैं कॉलम का नाम स्ट्रिंग के रूप में पास कर रहा हूं, इसलिए यह एक तरह का हार्डकोडेड है। यदि कॉलम का नाम इकाई की एनोटेशन में बदल जाता है, तो "छिपी निर्भरता" टूट जाती है।जेपीए

वहाँ जेपीए में एक तरह से स्तंभ का वास्तविक नाम निकालते हैं और यह संकलन समय पर उपलब्ध है, इसलिए मैं प्रश्नों में इसका इस्तेमाल कर सकते हैं?

उत्तर

6
बेशक

, वहाँ हमेशा एनोटेशन पर प्रतिबिंब है। मान लीजिए आप ठेठ जेपीए स्तंभ परिभाषा है:

@Basic(optional = true) 
    @Column(name = "MY_COLUMN_NAME_DESC", nullable = true, length = 255) 
    public String getDesc() { 
     return desc; 
    } 

फिर गेटर विधि का निरीक्षण किया पैदावार स्तंभ नाम मान (उदाहरण के here से अपनाया) होने:

Method method = ... //obtain entity object 
Annotation[] annotations = method.getDeclaredAnnotations(); 

for(Annotation annotation : annotations){ 
    if(annotation instanceof Column){ 
     Column myAnnotation = (Column) annotation; 
     System.out.println("name: " + myAnnotation.name()); 
     System.out.println("value: " + myAnnotation.value()); 
    } 
} 

उदाहरण जेपीए इकाई में विधि property access मान लिया गया है, लेकिन कुछ भी नहीं रोकता एक क्षेत्र में प्रतिबिंब लागू करके इसे फील्ड स्तर पर अपनाने के लिए।

+0

उत्साही के लिए, यह भी इस संपत्ति से स्तंभ का नाम हासिल जाँच कर सकते हैं (http://stackoverflow.com/a/25520204/1225337) –

1

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

  • विशेषताऑवर्राइड कक्षा एनोटेशन कॉलम एनोटेशन के साथ निर्दिष्ट कॉलम को ओवरराइड कर सकता है।
  • विरासत रणनीति में शामिल है, तो स्तंभ एक अलग तालिका में रहते हैं हो सकता है, भले ही एक मेज कॉलम टिप्पणी के साथ निर्दिष्ट नहीं है।
+0

वहाँ एक संपत्ति के लिए स्तंभ एनोटेशन प्राप्त करने के लिए जेपीए एपीआई है? एक्सएमएल विलय, विशेषताऑवर्राइड, @ कॉलम। धन्यवाद। – eastwater

+0

@Dave: कोई नहीं है कि मैं के बारे में पता मुझे डर लग रहा हूँ, लेकिन मैं पिछले साल या तीन चेक इन नहीं किया। मुझे अतीत में ऐसा करने की ज़रूरत थी और आपके द्वारा उल्लिखित स्रोतों को विलय करने में भी घायल होना पड़ा। कुछ जेपीए को फिर से बनाने के लिए बहुत बुरा, जटिल कोड वैसे भी करना चाहिए। शायद हाइबरनेट या एक्लिप्ससेंक के माध्यम से जाकर सीधे एक रास्ता प्रदान करता है ... –

+0

ऐसा लगता है कि वे ऐसे सार्वजनिक एपीआई प्रदान नहीं करते हैं। आंतरिक रूप से उनके पास अंतर स्रोतों से कॉन्फ़िगरेशन मर्ज करने के लिए कुछ होना चाहिए। – eastwater