2012-04-09 10 views
11

के अंदर विदेशी कुंजी मैपिंग JPA के लिए मैं eclipselink का उपयोग कर रहा हूं। मेरे पास एक इकाई है, जिसमें संयुक्त कुंजी दो फ़ील्ड से बना है। मेरे एम्बेड करने योग्य प्राथमिक कुंजी वर्ग के फ़ील्ड (सदस्य) हैं।एंबेडेबल क्लास

@Embeddable 
    public class LeavePK { 
     @ManyToOne(optional = false) 
     @JoinColumn(name = "staffId", nullable = false) 
     private Staff staff; 
     @Temporal(TemporalType.TIMESTAMP) 
     private Calendar date; 
     //setters and getters 
    } 

मेरे इकाई एक कर्मचारी से संबंधित डेटा छोड़ धारण करने के लिए जा रहा है, तो मैं स्टाफ वस्तु गठबंधन और तारीख छोड़ समग्र कुंजी निर्माण करने के लिए कोशिश कर रहा हूँ। मेरे तर्क के अलावा, यह मुझे एम्बेड करने योग्य वर्ग के अंदर एक विदेशी कुंजी मैपिंग करने की अनुमति नहीं दे रहा है। जब मैं जेपीए टूल्स का उपयोग करने का प्रयास करता हूं -> एंटीटी से टेबल्स जेनरेट करें, यह नीचे की त्रुटि देता है, जो बताता है, लेकिन मुझे यह नहीं मिल रहा है।

org.eclipse.persistence.exceptions.ValidationException 
Exception Description: The mapping [staff] from the embedded ID class [class rs.stapp.entity.LeavePK] is an invalid mapping for this class. An embeddable class that is used with an embedded ID specification (attribute [leavePK] from the source [class rs.stapp.entity.Leave]) can only contain basic mappings. Either remove the non basic mapping or change the embedded ID specification on the source to be embedded. 

क्या इसका मतलब है, मेरे पास एक कुंजी (समग्र कुंजी से) नहीं हो सकती है जो कि एक विदेशी कुंजी भी है। क्या इस ईआरएम को पूरा करने का कोई वैकल्पिक तरीका है? कृपया मदद करे। धन्यवाद

उत्तर

12

आईडी कक्षाओं में संबंध न रखें, न तो @IdClass या @EmbeddedId के लिए। @Embeddable कक्षा में केवल @Basic, @Column, @Temporal, @Enumerated, @Lob, या @Embedded शामिल हो सकते हैं। बाकी सब कुछ प्रदाता-विशिष्ट वाक्यविन्यास है (उदाहरण के लिए हाइबरनेट इसे अनुमति देता है, लेकिन चूंकि आप एक्लिप्ससेंक का उपयोग कर रहे हैं, जो जेपीए आरआई है, मुझे संदेह है कि यह वही है जो आप चाहते हैं)।

@Entity 
@Table(name = "Zips") 
public class Zip implements Serializable 
{ 
    @EmbeddedId 
    private ZipId embeddedId; 

    @ManyToOne 
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code") 
    private Country country = null; 

    ... 
} 

@Embeddable 
public class ZipId implements Serializable 
{ 
    @Column(name = "country_code") 
    private String countryCode; 

    @Column(name = "code") 
    private String code; 

    ... 
} 

HTH

:

यहाँ एक उदाहरण जेपीए पी/FK मानचित्रण है

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