2015-07-01 8 views
9

मैंने @Embedded एनोटेशन को छोड़कर कोशिश की है और अभी भी फ़ील्ड को तालिका में एम्बेड किया गया है। मुझे कुछ भी नहीं मिला जो कहता है कि @Embedded एनोटेशन वैकल्पिक है।क्या जेपीए @ एम्बेडेड एनोटेशन अनिवार्य है?

क्या यह या है यह वैकल्पिक नहीं है?

निम्नलिखित कोड

@Embeddable 
public class Address { 
    String city; 
    String street; 
} 

@Entity 
public class Person { 
    String name; 
    @Embedded // it seems that it works even if this annotation is missing!? 
    Address address; 
} 

हमेशा एक ही मेज उत्पन्न

person 
    name 
    city 
    street 

भले ही मैं नहीं@Embedded निर्दिष्ट करते हैं।


मेरे विन्यास:

  • JBoss ईएपी 6.4.0
  • हाइबरनेट-जेपीए-2.0-api-1.0.1.Final-redhat-3.jar

जेपीए विनिर्देश कहता है:

http://docs.oracle.com/javaee/7/api/javax/persistence/Embedded.html

@javax.persistence.Embedded

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

http://docs.oracle.com/javaee/7/api/javax/persistence/Embeddable.html

@javax.persistence.Embeddable

एक वर्ग जिसका उदाहरणों एक स्वामित्व इकाई के आंतरिक भाग के रूप में जमा हो जाती है और संस्था की पहचान का हिस्सा निर्दिष्ट करता है। एम्बेडेड ऑब्जेक्ट के प्रत्येक निरंतर गुण या फ़ील्ड को इकाई के लिए डेटाबेस तालिका में मैप किया जाता है।

+1

आपको इसे पहले से ही मिल गया है। विनिर्देशन में @ एम्बेडेड के लिए आवश्यकता नहीं है। तो मुझे लगता है कि यह कार्यान्वयन का एक वंशज है। यह देखना दिलचस्प होगा कि OpenJPA और EclipseLink वही करते हैं या नहीं। – kromit

+0

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

+1

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

उत्तर

1

हाइबरनेट का उपयोग करने के मामले में इससे कोई फर्क नहीं पड़ता कि आप फ़ील्ड को एनोटेट करते हैं (@Embedded) या यदि आप संदर्भित वर्ग (@Embeddable के रूप में) को एनोटेट करते हैं। हाइबरनेट को प्रकार निर्धारित करने के लिए दोनों में से कम से कम एक की आवश्यकता है।

और एक (छुपा हुआ) बयान हाइबरनेट प्रलेखन के अंदर इस बारे में नहीं है, एक नज़र यहाँ ले: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-component

इसे कहते हैं:

व्यक्ति इकाई दो घटक गुण, homeAddress और है जन्म। homeAddress संपत्ति को एनोटेट नहीं किया गया है, लेकिन Hibernate अनुमान लगाएगा कि यह पता कक्षा में @Embeddable एनोटेशन की तलाश करके एक सतत घटक है।

0

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

+1

क्षमा करें, मेरा प्रश्न * पूरे * जोड़ी * @ एम्बेडेड'-'@ एम्बेड करने योग्य 'के बारे में * नहीं * है। सवाल यह है: ** यदि ** ** मैं '@ एम्बेड करने योग्य 'निर्दिष्ट करता हूं, तो क्या मुझे ** ** को एम्बेड किया गया है @ एम्बेडेड'? प्रयोगों से ऐसा लगता है कि उत्तर * नहीं * है, हालांकि मुझे यह दस्तावेज़ीकरण में स्पष्ट रूप से नहीं मिला है। –

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