2015-10-15 6 views
5

में एम्बेड करने योग्य वर्ग के लिए आईडी प्रकारों को कॉन्फ़िगर करते समय अजीब समस्या मेरे वर्तमान कार्यान्वयन में मेरे पास प्रत्येक डीबी तालिका के लिए अलग इकाई वर्ग हैं। मैं eclipselink-2.5.2 के साथ जेपीए का उपयोग कर रहा हूँ। यह मेरे लिए ठीक काम कर रहा है लेकिन किसी बिंदु पर जब डेटा बड़ा होता है, तो यह लटकता है। यही कारण है कि मैंने @Embedded, @Embeddable और @EmbeddedId का उपयोग शुरू करने का निर्णय लिया। ऐसा करने के दौरान मुझे एक त्रुटि मिल रही है जो मेरे लिए बहुत अजीब है। यहां पूर्ण स्टैकट्रैक पोस्ट किया गया है: https://gist.githubusercontent.com/tjDudhatra/b955812e0d1a71cf97f1/raw/11ea458869e24baae744530417ac99bc877ed514/gistfile1.txtEclipseLink-2.5.2

विशिष्ट होने के नाते, मुझे आपको सटीक परिदृश्य दें जिससे मुझे अपवाद मिल रहा है। इस कोड ब्लॉक पर विचार करें जिसमें तीन वर्ग हैं। एक @Entity के रूप में एनोटेट किया गया है और अन्य twos @Embeddable के रूप में एनोटेटेड हैं। मुझे पता है कि एक वर्ग में हम @Id और @EmbeddedId को परिभाषित नहीं कर सकते हैं और मैं उस तरह से नहीं किया है, तो भी सर्वर की तैनाती करते हुए, मैं अपवाद है जो केवल कहते हो रही है कि:

[वर्ग org.apache । {SomeClass}] है दोनों एक @EmbdeddedId (विशेषता पर [id]) और एक @Id (विशेषता पर []। दोनों आईडी प्रकार एक ही इकाई पर निर्दिष्ट नहीं किया जा सकता है।

@Entity 
@Table(name="user") 
public class User { 

    @ID 
    public Long id; 

    @Column(name="userCode") 
    public String userCode; 

    @ElementCollection 
    @CollectionTable(name = "address", joinColumns = @JoinColumn(name = "user_id")) 
    public List<Address> addressList; 

    .... 
} 

@Embeddable 
public class Address { 

    @EmbeddedId 
    @Column(name = "id") 
    public Long id; 

    @Column(name="userId") 
    public Long userId; 

    @Column(name="address-line-1") 
    public String addressLine1; 

    @Column(name="address-line-2") 
    public String addressLine2; 

    @ElementCollection 
    @CollectionTable(name = "phone", joinColumns = @JoinColumn(name = "user_id")) 
    protected List<Phone> phoneList; 

    .... 
} 

@Embeddable 
public class Phone { 

    @EmbeddedId 
    @Column(name = "id") 
    public Long id; 

    @Column(name="contact_no") 
    public String contactNo; 

    @Column(name="country_code") 
    public int countryCode; 

    @Column(name="address_id") 
    public int addressId; 

    .... 
} 

कृपया अगर मुझे अधिक जानकारी की आवश्यकता है और किसी भी तरह की मदद की सराहना की जाएगी तो मुझे बताएं।

धन्यवाद,

+0

ओह मैं माफी माँगता हूँ, यह EclipseLink-2.5.2 –

उत्तर

3

तो यहां मुझे यह समस्या मिली। मैंने कुछ विश्लेषण किया और एम्बेड करने योग्य और तत्व चयन के बारे में और जानना पड़ा। यहां संदर्भ है: https://en.wikibooks.org/wiki/Java_Persistence/ElementCollection

तो अब मैंने तदनुसार कोड संशोधित किया है और यह ठीक काम कर रहा है।

@Entity 
@Table(name="user") 
public class User { 

    @ID 
    public Long id; 

    @Column(name="userCode") 
    public String userCode; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "user_id") 
    public List<Address> addressList; 

    .... 
} 

@Entity 
@Table(name="address") 
public class Address { 

    @Id 
    @Column(name = "id") 
    public Long id; 

    @Column(name="userId") 
    public Long userId; 

    @Column(name="address-line-1") 
    public String addressLine1; 

    @Column(name="address-line-2") 
    public String addressLine2; 

    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "address_id") 
    protected List<Phone> phoneList; 

    .... 
} 

@Entity 
@Table(name="phone") 
public class Phone { 

    @Id 
    @Column(name = "id") 
    public Long id; 

    @Column(name="contact_no") 
    public String contactNo; 

    @Column(name="country_code") 
    public int countryCode; 

    @Column(name="address_id") 
    public int addressId; 

    .... 
} 
3

एक वर्ग @Embeddable एनोटेट किसी भी @EmbeddedId नहीं होनी चाहिए।

@EmbeddedId किसी अन्य वर्ग में @Embeddable वर्ग के क्षेत्र को एनोटेट करना और इसे प्राथमिक कुंजी के रूप में चिह्नित करना है।

उदाहरण:

@Entity 
public class Project { 
    @EmbeddedId ProjectId id; 
    ... 
} 

@Embeddable 
Class ProjectId { 
    int departmentId; 
    long projectId; 
    ... 
} 

संपादित: आपके मामले में, मुझे नहीं लगता कि आप Phone चाहते हैं, और न ही Address@Embeddable किया जाना है। बस उन्हें नियमित @Entity के रूप में चिह्नित करें।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन आप विस्तार से बता सकते हैं कि अगर मैं atEmbeddable साथ फोन और पता वर्ग पर टिप्पणी नहीं करेंगे तो यह काम करेगा: यह मैं यह कैसे काम किया जाता है? मेरा मतलब है, अगर मैं कुछ वर्ग का संग्रह एम्बेड करना चाहता हूं तो उस कक्षा को एंबेडेबल के रूप में एनोटेट किया जाना चाहिए, है ना? अगर मैं गलत हूं तो मुझे सही करें। –

+2

नहीं, '@ एम्बेड करने योग्य 'वास्तव में एक कक्षा के लिए है जो एक कुंजी के रूप में कार्य करता है। क्या आपका डेटाबेस स्कीमा तय है? यदि ऐसा है, तो कृपया उनके बीच उपयोगकर्ता, पता और लिंक के लिए टेबल प्रदान करें; –

+1

मुझे यह अवधारणा अब स्पष्ट हो गई है, धन्यवाद .. –