2012-12-14 51 views
34

का उद्देश्य क्या है, मैं सिर्फ यह जानना चाहता हूं कि इन सभी एनोटेशन के बीच क्या अंतर है। हम इनका उपयोग क्यों कर रहे हैं ... इसका मतलब है कि उनके पास विशेष रूप से फील्ड स्तर और संपत्ति का कोई प्रभाव नहीं है।AccessType.FIELD, AccessType.PROPERTY और @Access

और की तरह मिश्रित स्तर एनोटेशन का उपयोग करने का उद्देश्य क्या है:

@Entity 
@Access(AccessType.FIELD) 
class Employee { 
    // why their is a field level access 
    private int id; 

    // whats the purpose of transient here 
    @Transient        
    private String phnnumber; 

    // why its a property level access 
    @Access(AccessType.property)    
    public String getPhnnumber() { 
     return "1234556"; 
    } 

} 

वास्तव में इस वर्ग क्या कहते हैं?

+0

उत्कृष्ट तुलना चर्चा भी देखें: http://stackoverflow.com/questions/594597/hibernate-annotations-which-is-better-field-or-property-access – GKislin

उत्तर

48

डिफ़ॉल्ट रूप से एक्सेस प्रकार उस स्थान द्वारा परिभाषित किया जाता है जहां आपने अपना पहचानकर्ता एनोटेशन (@Id) रखा था। यदि आप इसे फ़ील्ड पर डालते हैं - यह AccessType.FIELD होगा, यदि आप इसे गेटटर पर डालते हैं - यह AccessType.PROPERTY होगा।

कभी-कभी आप टिप्पणी करने के लिए नहीं क्षेत्रों लेकिन गुण (जैसे क्योंकि आप गेटर में या क्योंकि आप इसे इस तरह से पसंद करते हैं कुछ मनमाने ढंग से तर्क करना चाहते हैं।) ऐसी स्थिति में आप एक गेटर को परिभाषित करने और AccessType.PROPERTY के रूप में उस पर टिप्पणी करना चाहिए चाहते हो सकता है।

जहां तक ​​मुझे याद है, यदि आप किसी भी इकाई फ़ील्ड/विधियों पर AccessType.FIELD या AccessType.PROPERTY निर्दिष्ट करते हैं तो आपको पूरे वर्ग के लिए डिफ़ॉल्ट व्यवहार निर्दिष्ट करना होगा। और वह, (डिफ़ॉल्ट मान रहा है कि AccessType.FIELD के बावजूद।) तुम क्यों वर्ग स्तर पर AccessType.FIELD अवश्य होनी चाहिए

अब अगर आप phnnumber मैदान पर @Transient नहीं होती, जेपीए एक 3 कॉलम तालिका के साथ आप प्रदान करेगा :

  • आईडी,
  • phnnumber,
  • getphnnumber।

क्योंकि यह इकाई क्षेत्र (id और phnnumber) के सभी के लिए AccessType.FIELD का प्रयोग करेंगे और, एक ही समय में, यह आपके गेटर (getPhnnumber()) के लिए AccessType.PROPERTY का उपयोग करेंगे कि।
आप डेटाबेस में दो बार मैप किए गए फोन नंबर के साथ समाप्त हो जाएंगे।

इसलिए, @Transient एनोटेशन की आवश्यकता होती है - इसका मतलब है कि इकाई अंतर्निहित भंडारण में क्षेत्र का मूल्य है, लेकिन अपने गेटर द्वारा दिए गए मान संग्रहीत नहीं करेगा।

+10

डिफ़ॉल्ट FIELD नहीं है। एक्सेस प्रकार FIELD है यदि आप फ़ील्ड पर मैपिंग एनोटेशन डालते हैं, और यदि आप गेटर्स पर मैपिंग एनोटेशन डालते हैं तो यह प्रॉपर्टी है। और सभी इकाई पदानुक्रम मैपिंग एनोटेशन प्लेसमेंट में सुसंगत होना चाहिए: हमेशा फ़ील्ड पर, या हमेशा गेटर्स पर, लेकिन मिश्रित नहीं। –

+1

आप सही हैं - डिफ़ॉल्ट उस पर निर्भर है जहां 'आईडी आईडी एनोटेशन स्थित है। मिश्रण के बारे में - आप केवल आईडी एनोटेशन या इस तथ्य के लिए जिक्र कर रहे हैं कि आप इकाई पदानुक्रम में संपत्ति/क्षेत्र का उपयोग नहीं कर सकते हैं? –

+3

यदि आप स्पष्ट रूप से एक्सेस प्रकार निर्दिष्ट नहीं करते हैं, तो जेपीए स्पेक का कहना है कि पदानुक्रम में सभी मैपिंग एनोटेशन फ़ील्ड या गेटर्स पर रखे जाने चाहिए। क्या होता है यदि आप नियम का सम्मान नहीं करते हैं तो निर्दिष्ट नहीं है। हाइबरनेट दिखता है जहां आईडी एनोटेशन है, और यदि यह क्षेत्र में है तो यह गेटर्स (और इसके विपरीत) पर सभी टिप्पणियों को अनदेखा करता है, लेकिन यह हाइबरनेट-विशिष्ट है। इस तरह के मामले में व्यवहार अनिर्धारित है (यही वह बात है जो कल्पना करता है)। –

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

  • कोई संबंधित समस्या नहीं^_^