2012-10-04 17 views
17

यह काफी बेवकूफ़ होना चाहिए, लेकिन मुझे @Entity और @Embeddable का उपयोग करने पर संदेह है।@embeddable बनाम @entity एक संग्रह मैपिंग के लिए

कहें कि मेरे पास User और Notification कक्षा है।

@Entity 
public class User{ 
    //other properties 
    @onetomany 
    private List<Notification> notifications; 
} 

@Entity 
public class Notification{ 
    //properties 
} 

मैं समझता हूँ कि वहाँ वर्ग User और Notification, और मानचित्रण के लिए एक तिहाई तालिका के लिए टेबल किया जाएगा। अगर मैं ऐसा करता हूं तो क्या होगा?

@Entity 
public class User { 
    //other properties 
    @ElementCollection 
    private List<Notification> notifications; 
} 

@Embeddable 
public class Notification{ 
    //properties 
} 

मुझे पता है कि यह Notification के लिए कोई तालिका नहीं बनाएगा। लेकिन मैं अभी भी अपनी अधिसूचना वस्तुओं को स्टोर कर सकता हूं। मैं documentation के माध्यम से गया, लेकिन कुछ संदेह:

  1. क्या यह इस बात पर आधारित है कि मैं कक्षा बी को एक अलग तालिका के रूप में देखना चाहता हूं?
  2. क्या कोई प्रदर्शन अंतर बी/डब्ल्यू एक टेबल और एक एम्बेड करने योग्य ऑब्जेक्ट बना रहा है?
  3. मैं एम्बेड करने योग्य ऑब्जेक्ट के साथ क्या नहीं कर सकता जो मैं तालिका से सीधे पूछताछ के अलावा किसी तालिका के साथ कर सकता हूं?

नोट

इस सवाल पढ़ने किसी के लिए, यह question भी आपकी मदद कर सकता है।

उत्तर

8
  1. क्या यह इस बात पर आधारित है कि मैं कक्षा बी को एक अलग तालिका के रूप में देखना चाहता हूं?

हाँ, जब आप @Embedded उपयोग करते हैं, आप को एम्बेड कि @Entity कक्षा में @Embeddable इकाई है, यह @Entity वर्ग का एक ही तालिका में एम्बेडेड इकाई के लिए स्तंभ जोड़ने बनाता है।

  1. क्या कोई प्रदर्शन अंतर बी/डब्ल्यू एक टेबल और एक एम्बेड करने योग्य ऑब्जेक्ट बना रहा है?

जब आप तालिका निर्माण के लिए @Embedded का उपयोग करते हैं, तो पंक्ति को डालने और चुनने के लिए भी एक क्वेरी की आवश्यकता होती है। लेकिन यदि आप इसका उपयोग नहीं करते हैं, तो कई प्रश्नों की आवश्यकता होती है, इसलिए @Embedded का उपयोग अधिक प्रदर्शन पैदा करता है, हम कह सकते हैं।

  1. मैं एम्बेड करने योग्य ऑब्जेक्ट के साथ क्या नहीं कर सकता जो मैं तालिका से सीधे पूछताछ के अलावा किसी तालिका के साथ कर सकता हूं?

संबंधित एम्बेडेड इकाई को हटाया जा सकता है, लेकिन इसके लिए अखंडता बाधा उल्लंघन हो सकता है।

+0

मुझे लगता है कि मैं एलीमेंट कोलेक्शन के साथ एंबेडेबल का उपयोग कर सकता हूं। मुझे @Embedded आरटी का उपयोग करने की ज़रूरत नहीं है? – shazinltc

+0

मुझे आपका तीसरा बिंदु नहीं मिला। – shazinltc

+0

तीसरा बिंदु: व्यक्ति को पता (एम्बेडेड) पर विचार करें, यदि दोनों के लिए अलग तालिका है, तो आप सीधे संबंधित पते को हटा सकते हैं, लेकिन यदि व्यक्ति की तालिका में एफके है। संबोधित करने के लिए, यह अखंडता बाधा उल्लंघन का कारण बन सकता है। – deepakraut

0

जेपीए में, समग्र कुंजी फ़ील्ड बनाने के कुछ तरीके हैं। आइए @Embeddable annotation का उपयोग करके विधि देखें।
चलिए इकाई वर्ग से शुरू करते हैं।

@Entity 
@Table 
public class TraceRecord { 
    @Id 
    private TraceRecordPk id; 

    @Version 
    @Transient 
    private int version; 

    @Column(columnDefinition = "char") 
    private String durationOfCall; 

    @Column(columnDefinition = "char") 
    private String digitsDialed; 

    @Column(columnDefinition = "char") 
    private String prefixCalled; 

    @Column(columnDefinition = "char") 
    private String areaCodeCalled; 

    @Column(columnDefinition = "char") 
    private String numberCalled; 
} 

यह @Id और @Version फ़ील्ड और कुछ @ कॉलम परिभाषाओं के साथ एक सुंदर सरल इकाई वर्ग है। बहुत अधिक जानकारी के बिना, आप देखेंगे कि @Version फ़ील्ड भी @ ट्रांसिएंट एनोटेटेड है। मैंने यह इसलिए किया है क्योंकि मेरी तालिका में संस्करणों को ट्रैक करने के लिए कोई कॉलम नहीं है, लेकिन मेरा डेटाबेस जर्नल है, इसलिए मैं संस्करण के बारे में बहुत चिंतित नहीं हूं। आप यह भी देखेंगे कि @ कॉलम फ़ील्ड में कॉलम परिभाषा विशेषता पर "char" सेट का मान है। ऐसा इसलिए है क्योंकि मेरी तालिका में खेतों को चार के रूप में परिभाषित किया गया है और वर्चर नहीं है। अगर वे वर्कर थे, तो मुझे स्ट्रिंग मैप्स के बाद डिफ़ॉल्ट रूप से एक वर्चर्स फ़ील्ड में ऐसा करने की आवश्यकता नहीं होगी।

@Id फ़ील्ड जो मुझे अभी रूचि है। यह एक मानक जावा प्रकार नहीं है, लेकिन एक वर्ग जिसे मैंने स्वयं परिभाषित किया है। वह वर्ग यहाँ है।

@Embeddable 
public class TraceRecordPk implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Temporal(TemporalType.DATE) 
    @Column 
    private Date dateOfCall; 

    @Column(columnDefinition="char") 
    private String timeOfCall; 

    @Column(columnDefinition="char") 
    private String callingParty; 

    /** 
    * Constructor that takes values for all 3 members. 
    * 
    * @param dateOfCall Date the call was made 
    * @param timeOfCall Time the call was made 
    * @param callingParty Extension from which the call originated 
    */ 
    public TraceRecordPk(Date dateOfCall, String timeOfCall, String callingParty) { 
     this.dateOfCall = dateOfCall; 
     this.timeOfCall = timeOfCall; 
     this.callingParty = callingParty; 
    } 
} 

इस वर्ग एक इकाई वर्ग पर एक @Id क्षेत्र में किया जा रहा करने में सक्षम बनाने के लिए, यह @Embeddable साथ टिप्पणी की जा करने के लिए की तरह मैंने पहले बताया की जरूरत है। मेरे समग्र कुंजी के लिए मैंने चुने गए 3 फ़ील्ड केवल सामान्य @ कॉलम परिभाषाएं हैं। प्रत्येक फ़ील्ड के लिए गेटर्स/सेटर्स बनाने के बजाय, मैंने बस एक कन्स्ट्रक्टर लागू किया है जो सभी 3 क्षेत्रों के लिए मूल्य लेता है, जिससे कोई भी उदाहरण अपरिवर्तनीय हो जाता है। @Embeddable के साथ कक्षा को एनोटेट करते समय, उस वर्ग को Serializable को लागू करने की आवश्यकता होगी। तो मैंने समायोजित करने के लिए एक डिफ़ॉल्ट serialVersionUID जोड़ा है।

अब आपके पास @Embeddable के साथ बनाई गई और एनोटेटेड कक्षा है, अब आप इसे अपने एंटिटी क्लास में @Id फ़ील्ड के प्रकार के रूप में उपयोग कर सकते हैं। सरल सामान आह।

+0

धन्यवाद लेकिन मैंने यह [लेख] पढ़ा है (http://jpgmr.wordpress.com/2011/03/27/using-the-jpa-embeddable-annotation-to-create-your-own-composite-keys /)। यह मेरे प्रश्न का उत्तर नहीं देता है। मेरा सवाल किसी भी तरह से समग्र कुंजी से संबंधित नहीं है। – shazinltc