2010-07-20 19 views
18

मैं अपनी हाइबरनेट एनोटेशन कहां डालूं?हाइबरनेट एनोटेशन कहां रखा जाए?

क्या यह मेरे आवृत्ति चर के ऊपर की रेखा है? या गेटटर से पहले? या सेटर से पहले? या यह वास्तव में कोई फर्क नहीं पड़ता?

धन्यवाद बहुत

+1

मुझे तब से पता चला है कि यदि मैं फ़ील्ड एक्सेस का उपयोग करता हूं, तो मैं प्रॉक्सी के साथ सभी तरह की समस्याओं में भाग लेता हूं जो हाइबरनेट आलसी लोडिंग के लिए उपयोग करता है। तो यह गेटर्स/सेटर्स है! बचाव के लिए वू कोड पीढ़ी! अरे यह जावा सामान verbose है! – Chris

+0

^दरअसल, मैं थोड़ी देर के लिए आलसी लोडिंग मुद्दों से जूझ रहा हूं (मेरे मॉडल को केवल काम करने के लिए उत्सुक लाने के लिए सेट करें, जबकि यह केवल एक प्रोटोटाइप है!) लेकिन हां, हाइबरनेट के लिए गेटर्स/सेटर्स बहुत महत्वपूर्ण हैं। – fabspro

+0

मेरी पुस्तक - हाइबरनेट ने मुझे आसान और गेटर्स और सेटर्स के सामने रखने के लिए कहा है। इडिक क्यों। –

उत्तर

21

आप उन्हें फ़ील्ड पर या गेटर पर रखें। से हाइबरनेट एनोटेशन संदर्भ गाइड:

2.2.1. Marking a POJO as persistent entity

(...)

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

:

तुम भी @Access एनोटेशन मजबूर/एक्सेस प्रकार ओवरराइड करने देता है के बारे में पढ़ने के लिए चाहते हो सकता है (पहले हाइबरनेट एनोटेशन 3.5 और जेपीए 2.0 के लिए, यह हाइबरनेट एनोटेशन एक्सटेंशन का हिस्सा था) 2.2.2.2. Access type

डिफ़ॉल्ट रूप से एक वर्ग पदानुक्रम के एक्सेस प्रकार @Id या @EmbeddedId एनोटेशन की स्थिति द्वारा परिभाषित किया गया है। यदि ये एनोटेशन फ़ील्ड पर हैं, तो केवल फ़ील्ड को दृढ़ता के लिए माना जाता है और राज्य को क्षेत्र के माध्यम से तक पहुंचाया जाता है। यदि एनोटेशन गेटर पर हैं, तो केवल प्राप्तकर्ताओं को दृढ़ता के लिए माना जाता है और राज्य गेटर/सेटर के माध्यम से उपयोग किया जाता है। यह अभ्यास में अच्छी तरह से काम करता है और अनुशंसित दृष्टिकोण है।

नोट

एक वर्ग पदानुक्रम के अंतर्गत एनोटेशन की नियुक्ति एक समान होना चाहिए (या तो क्षेत्र या संपत्ति पर) डिफ़ॉल्ट पहुँच प्रकार का निर्धारण करने में सक्षम हो गया है। पर एक एकल एनोटेशन प्लेसमेंट रणनीति को अपने पूरे एप्लिकेशन पर टिकने की अनुशंसा की जाती है।

कुछ स्थितियों में

हालांकि, अगर आप की जरूरत है:

  • बल इकाई पदानुक्रम
  • ओवरराइड वर्ग पदानुक्रम में एक विशिष्ट संस्था की पहुंच प्रकार की पहुंच प्रकार
  • ओवरराइड एक एम्बेड करने योग्य प्रकार का उपयोग प्रकार

सबसे अच्छा उपयोग केस एक एम्बेड करने योग्यहैकक्षा कई इकाइयों द्वारा उपयोग की जाती है जो समान पहुंच प्रकार का उपयोग नहीं कर सकती हैं। में यह मामला एम्बेड करने योग्य वर्ग स्तर पर एक्सेस प्रकार को मजबूर करना बेहतर है।

(...)

पेशेवरों और दोनों शैलियों के विपक्ष के बारे में, मैं निम्नलिखित प्रश्नों को पढ़ने के लिए सुझाव देते हैं:

+0

तो क्या आप कह रहे हैं कि यदि मैं फ़ील्ड पर एनोटेशन डालता हूं, तो प्राप्त/सेटर्स का उपयोग किसी भी चीज़ के लिए नहीं किया जाएगा?सरल (उदाहरण के लिए स्ट्रिंग) फ़ील्ड के बारे में क्या है जिन्हें एनोटेशन की आवश्यकता नहीं है, क्या उनके फ़ील्ड या सेटर्स का उपयोग किया जाएगा? – Chris

+0

@Chris: यदि आप फ़ील्ड एक्सेस का उपयोग करते हैं, * हाइबरनेट * प्रतिबिंब का उपयोग करके प्राप्त/सेट जोड़ी को बाईपास कर सीधे क्षेत्र तक पहुंच जाएगा। आपकी टिप्पणी के दूसरे भाग के बारे में, यह सब एक्सेस प्रकार - फ़ील्ड या प्रॉपर्टी पर निर्भर करता है - जिसे @Id या @ एम्बेडेड आईडी * की स्थिति से अनुमान लगाया जाएगा। –

+1

मुझे तब से पता चला है कि यदि मैं फ़ील्ड एक्सेस का उपयोग करता हूं, तो मैं प्रॉक्सी के साथ सभी तरह की समस्याओं में भाग लेता हूं जो हाइबरनेट आलसी लोडिंग के लिए उपयोग करता है। तो यह गेटर्स/सेटर्स है! बचाव के लिए वू कोड पीढ़ी! अरे यह जावा सामान verbose है! – Chris

2

यह आपकी शैली पर निर्भर है। आप इसे मैदान से पहले या गेटटर से पहले रख सकते हैं। सख्त जेपीए में, सेटर्स पर टिप्पणियां अनदेखा की जाती हैं, लेकिन मुझे यकीन नहीं है कि हाइबरनेट इसका अनुसरण करता है या नहीं।

आपको या तो अपनी संपूर्णता में सुसंगत होने की आवश्यकता है, या आपको कक्षा के शीर्ष पर एक डिफ़ॉल्ट मोड के साथ @Access एनोटेशन प्रदान करने की आवश्यकता है, और एक अन्य @Access प्रत्येक फ़ील्ड/प्रॉपर्टी से पहले आप वर्तमान से विचलित करना चाहते हैं कक्षा मोड

1

हाइबरनेट जावा प्रतिबिंब का उपयोग करने के लिए जाना जाता है। तो यह वास्तव में कोई फर्क नहीं पड़ता कि आप इसे दायर या ऊपर गेटर के ऊपर रखते हैं या नहीं।

1

यहां हाइबरनेट में उपयोग की जाने वाली कुछ महत्वपूर्ण टिप्पणियों का विवरण दिया गया है।

@Entity: declares the class as an entity (i.e. a persistent POJO class) 

@Table: is set at the class level; it allows you to define the table, catalog, and schema names for your entity mapping. If no @Table is defined the default values are used: the unqualified class name of the entity. 

@Id: declares the identifier property of this entity. 

@Generated Value: annotation is used to specify the primary key generation strategy to use. If the strategy is not specified by default AUTO will be used. 

@Column: annotation is used to specify the details of the column to which a field or property will be mapped. If the @Column annotation is not specified by default the property name will be used as the column name. 

एनोटेशन हाइबरनेट में आधारित विरासत मानचित्रण: हाइबरनेट में तीन प्रकार के ओएस विरासत मैपिंग नहीं है। वे हैं

क्लास पदानुक्रम प्रति 1.Table:

@Inheritance – Defines the inheritance strategy to be used for an entity class hierarchy. It is specified on the entity class that is the root of the entity class hierarchy. 

@DiscriminatorColumn – Is used to define the discriminator column for the SINGLE_TABLE inheritance mapping strategies. The strategy and the discriminator column are only specified in the root of an entity class hierarchy or sub hierarchy in which a different inheritance strategy is applied 

If the @DiscriminatorColumn annotation is missing, and a discriminator column is required, the name of the discriminator column defaults to "DTYPE" and the discriminator type to DiscriminatorType.STRING. 

@DiscriminatorValue – Is used to specify the value of the discriminator column for entities of the given type. The DiscriminatorValue annotation can only be specified on a concrete entity class. If the DiscriminatorValue annotation is not specified and a discriminator column is used, a provider-specific function will be used to generate a value representing the entity type. If the DiscriminatorType is STRING, the discriminator value default is the entity name. 

प्रति उप 2.Table क्लास पदानुक्रम:

@InheritanceType – Defines inheritance strategy options. TABLE_PER_CLASS is a strategy to map table per concrete class. 
@AttributeOverrides – This annotation is used to override mappings of multiple properties or fields. 

@AttributeOverride – The AttributeOverride annotation is used to override the mapping of a Basic (whether explicit or default) property or field or Id property or field. 
:

@InheritanceType – Defines inheritance strategy options. JOINED is a strategy in which fields that are specific to a subclass are mapped to a separate table than the fields that are common to the parent class, and a join is performed to instantiate the subclass. 

@PrimaryKeyJoinColumn – This annotation specifies a primary key column that is used as a foreign key to join to another table. 

कंक्रीट वर्ग पदानुक्रम प्रति 3.Table

आशा है कि यह हाइबेनेट में उपयोग की जाने वाली मूल एनोटेशन पर विचार प्राप्त करने में मदद करे।

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