2009-06-02 12 views
31

मेरे पास हाइबरनेट के उपयोग के बारे में एक साधारण सवाल है। मैं कक्षा के क्षेत्रों को एनोटेट करके और संबंधित बीन्स पर प्राप्त विधि को एनोटेट करके दो तरीकों में से एक में जेपीए एनोटेशन का उपयोग करके लोगों को देख रहा हूं।हाइबरनेट/जेपीए - एनोटेटिंग बीन विधियों बनाम फ़ील्ड

मेरा प्रश्न इस प्रकार है: क्या एनोटेटिंग फ़ील्ड्स और बीपी विधियों के बीच अंतर है जैसे कि @ आईडी।

उदाहरण:

@Entity 
public class User 
{ 

**@ID** 
private int id; 

public int getId(){ 
return this.id; 
} 

public void setId(int id){ 
this.id=id; 
} 

} 

----------- या -----------

@Entity 
public class User 
{ 


private int id; 

**@ID** 
public int getId(){ 
return this.id; 
} 

public void setId(int id){ 
this.id=id; 
} 

} 

उत्तर

41

हाँ, खेतों आप व्याख्या करता है, तो , हाइबरनेट सेट करने और उन फ़ील्ड को पाने के लिए फ़ील्ड एक्सेस का उपयोग करेगा। यदि आप विधियों को एनोटेट करते हैं, तो हाइबरनेट गेटर्स और सेटर्स का उपयोग करेगा। Hibernate @Id एनोटेशन के स्थान के आधार पर पहुंच विधि का चयन करेगा और मेरे ज्ञान के लिए आप मिश्रण और मिलान नहीं कर सकते हैं। यदि आप @Id के साथ फ़ील्ड को एनोटेट करते हैं, तो विधियों पर टिप्पणियां अनदेखा की जाएंगी और वीजा बनाम। आप मैन्युअल रूप से कक्षा के स्तर का एनोटेशन @AccessType

Hibernate Annotations reference guide साथ विधि सेट कर सकते हैं इस तरह के प्रश्नों के लिए एक अत्यंत उपयोगी संसाधन साबित हो और विवरण कैसे पहुँच प्रकार पदानुक्रम नीचे झरना गया है।

+0

@ डेविड - हाँ, मेरा मानना ​​है कि यह जेपीए के लिए समान है। हालांकि जेपीए @AccessType –

+0

का समर्थन नहीं करता है एक सुधार, आप वास्तव में दृष्टिकोण को मिश्रित कर सकते हैं। मेरा मतलब है कि आपके पास AccessType.PROPERTY और AccessType.FIElD वाले क्लास हो सकते हैं। हालांकि इसकी अनुशंसा नहीं की जाती है लेकिन आप इसे कर सकते हैं। –

+0

धन्यवाद यह स्वीकार्य उत्तर होना चाहिए। विशेष रूप से मिश्रण और मैच भाग। – cabaji99

2

मेरी सिफारिश विधियों को एनोटेट करना है। ऐसा करके, आप थोड़ा लचीलापन प्राप्त करते हैं। उदाहरण के लिए, मान लीजिए कि आप कुछ वर्गों डालते हैं:

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity

AbstractEntity आईडी क्षेत्र/गेटर/सेटर परिभाषित करता है। कक्षा StringIdEntity और AutoIdEntityAbstractEntity से प्राप्त होती है, लेकिन विभिन्न @Id रणनीतियों का उपयोग करें। यदि आप फ़ील्ड को एनोटेट करते हैं, तो आप इसे कक्षा से दूसरे में बदल नहीं सकते हैं।

आप तरीकों पर टिप्पणी है, तो आप को चिह्नित getId()@Transient/abstract के रूप में AbstractEntity और फिर उपवर्गों में, आप बस विधि ओवरराइड और रणनीति आप उपयोग करना चाहते लागू होते हैं। मैं खुद खेतों को एनोटेट करता था और इसमें भाग गया और फैसला किया कि मैं हमेशा आगे बढ़ने के तरीकों को एनोटेट कर दूंगा।

तो, अगर आपको तुरंत एनोटेटिंग विधियों के लाभ दिखाई नहीं देते हैं, तो यह लाइन के नीचे स्पष्ट हो सकता है जब आपके पास स्विच करने वाली इतनी सारी कक्षाएं पूरी तरह से सिरदर्द बनने जा रही हैं।

3

आप एक्सेसर्स को क्यों एनोटेट करेंगे? यह सिर्फ सादा गन्दा दिखता है और बनाए रखने के लिए दर्द है। जेपीए या हाइबरनेट को कैसे लागू किया जाता है, यह जानने के लिए अब मुझे कक्षा में सभी शिकार करना है। ग्रहण के लिए कुछ हाइबरनेट कोड पीढ़ी प्लगइन के साथ काम करते समय यह डिफ़ॉल्ट है और यह मुझे बोनकर्स ड्राइवर बनाता है।

उल्लेख नहीं है कि हम एक्सेसर्स का उपयोग करने का एक अन्य कारण संपत्ति पहुंच या संदर्भ माता-पिता या अन्य ऑब्जेक्ट में तर्क जोड़ना है जो कहा गया एनोटेशन के साथ अच्छी तरह से मेल नहीं खाता है।

+1

आप टेम्पलेट का उपयोग करके एनोटेशन स्थान को संशोधित कर सकते हैं, यहां एक विस्तृत ट्यूटोरियल है कि एक्सेसर से फ़ील्ड में एनोटेशन स्थान कैसे बदलें: http://stackoverflow.com/questions/1861817/hibernate-moving-annotations-from-property-method- स्तर करने के लिए क्षेत्र स्तर के – Grubhart

1

कई चर्चाएं उपलब्ध हैं जो संपत्ति पर FIELD का उपयोग करने के लिए किनारे देती हैं (देखें - http://java.dzone.com/tips/12-feb-jpa-20-why-accesstype)। वसंत ढांचे में भी संपत्ति पर FIELD का उपयोग करने की सिफारिश की जाती है (देखें - http://static.springsource.org/spring/docs/2.5.x/reference/orm.html)। मुझे केवल FIELD अधिक क्लीनर दृष्टिकोण नहीं मिलता है क्योंकि आपको सेटर्स/गेटर्स को लागू करने के लिए मजबूर नहीं किया जाता है लेकिन आप अपनी कक्षा में अपने कस्टम प्रकार सेटर्स/गेटर्स प्राप्त कर सकते हैं। तो एक बेहतर encapsulation और अधिक स्वच्छ वर्गों। प्रदर्शन के अनुसार एफआईईएलडी संपत्ति पर थोड़ा सा बढ़त है लेकिन यह नगण्य है।

एक पंक्ति में संपत्ति पर FIELD का उपयोग करें। यदि आपको वास्तव में इसकी आवश्यकता है तो संपत्ति का उपयोग करें।

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