2011-01-08 13 views
5

में @EmbeddedId से बैकरेफर सेट करने के लिए कैसे करें किसी को पता है कि जेपीए @EmbeddedId के भीतर से बैकरेफर स्थापित करना संभव है या नहीं।जेपीए

इसलिए उदाहरण के लिए वहाँ

@Entity 
public class Entity1 { 
    @Id 
    @GeneratedValue 
    private String identifier; 

    private Entity1 relationToEntity1; 
    //Left out the getters and setters for simplicity 
} 

और एक जटिल एम्बेडेड आईडी के साथ एक दूसरे इकाई फॉर्म की एक इकाई है। इस दूसरी इकाई का एक हिस्सा इसकी मूल इकाई का संदर्भ है। इसलिए जैसा:

Exception [EclipseLink-93] (Eclipse Persistence Services - 1.1.0.r3639-SNAPSHOT): 
org.eclipse.persistence.exceptions.DescriptorException 
Exception Description: The table [ENTITY1] is not present in this descriptor. 
Descriptor: RelationalDescriptor(test.Entity2 --> [DatabaseTable(ENTITY2)]) 

:

@Entity 
public class Entity2 { 
    @EmbeddedId private Entity2Identifier id; 
    //Left out the getters and setters for simplicity. 
} 

@Embedabble 
public class Entity2Identifier { 
    private String firstPartOfIdentifier; 
    private Entity1 parent; 
    //Left out the getters and setters for simplicity. 
} 

जब मैं जेपीए के माध्यम से इस तरह के एक निर्माण को बचाने की कोशिश एक डेटाबेस के लिए (कार्यान्वयन EclipseLink है) मैं प्रपत्र के कई अपवाद मिल

क्या किसी को ऐसी समस्या का सामना करना पड़ा है और इसका कोई समाधान है?

उत्तर

4

जो आप खोज रहे हैं वह व्युत्पन्न आईडी है। यदि आप जेपीए 2.0 का उपयोग कर रहे हैं तो निम्नलिखित काम करेंगे। आप वास्तव में नहीं चाहते कि पूरे माता-पिता पीके का हिस्सा हों, केवल माता-पिता के पीके।

@Entity 
public class Entity1 { 
    @EmbeddedId 
    private ParentId identifier; 

    @OneToOne(mappedBy="relationToEntity1") 
    private Entity2 relationToEntity2; 

    //Left out the getters and setters for simplicity 
} 

@Entity 
public class Entity2 { 
    @EmbeddedId private Entity2Identifier id; 
    //Left out the getters and setters for simplicity. 

    @MapsId("parentId") 
    @OneToOne 
    private Entity1 parent; 

} 

@Embedabble 
public class Entity2Identifier { 
    private String firstPartOfIdentifier; 
    private ParentId parentId; 
    //Left out the getters and setters for simplicity. 
} 
+0

ठीक है। मुझे लगता है कि मेरा उदाहरण सरल था। माता-पिता में वास्तव में एक जटिल एम्बेडेड आईडी होती है, जिसमें दो तार होते हैं। यही कारण है कि मैं बस इसकी आईडी का संदर्भ नहीं दे सकता। – ali

+1

कि रूप में अच्छी तरह सरल है। मैं इकाई पर एक EmbeddedId उपयोग करने के लिए 1. –

+1

@MapsId विजेता है मेरी उदाहरण अद्यतन किया है ऊपर! बहुत उपयोगी –

1

@EmbeddedId एनोटेशन समग्र पहचान वर्ग में संबंधों की अनुमति नहीं देता है। EmbeddedId JavaDoc से:

एक एम्बेडेड आईडी क्लास के भीतर परिभाषित रिलेशनशिप मैपिंग समर्थित नहीं हैं।

मैं समझता हूँ कि आप Entity2Identifier माता-पिता के लिए महत्वपूर्ण शामिल करना चाहते हैं, लेकिन अपने उदाहरण में, तुम सिर्फ माता पिता की प्राथमिक कुंजी सहित से संपूर्ण वस्तु के लिए एक रिश्ता बना रहे हैं बल्कि। यहां तक ​​कि यदि इस निर्माण ने काम किया है, तो आप न केवल माता-पिता की प्राथमिक कुंजी, बल्कि माता-पिता की संपूर्ण स्थिति होने के लिए समग्र कुंजी स्थापित करेंगे।

@Entity 
public class Entity1 { 
    @Id 
    @GeneratedValue 
    private String identifier; 

    @OneToOne(mappedBy="relationToEntity1") 
    private Entity2 relationToEntity2; 
    ... 
} 

@Entity 
public class Entity2 { 

    @OneToOne 
    private Entity1 relationToEntity1; 
    ... 
} 

एनोटेशन के इस सेट, जेपीए के साथ:

आप बस द्वि-दिशात्मक संबंधों की स्थापना के लिए एक आसान तरीका ढूंढ रहे हैं, तो आप ऐसा @OneToOne टिप्पणी के साथ mappedBy विशेषता करते हैं और कर सकते हैं प्रदाता Entity1.relationToEntity2 और Entity2.relationToEntity1 को द्वि-दिशात्मक संबंध के रूप में ठीक से संभाल लेंगे। आप डिफॉल्ट कैस्केड व्यवहार (कोई नहीं) के साथ-साथ डिफ़ॉल्ट अनाथ हटाने का व्यवहार (कोई नहीं) ओवरराइड करना चाहेंगे। अधिक जानकारी के लिए JavaDoc देखें।

+0

अपने जवाब के लिए धन्यवाद। असल में मैं उसे जानता हूँ। समस्या यह है कि मेरी प्राथमिक कुंजी में कई भाग होते हैं, जिनमें से एक मूल इकाई है। इसका मतलब है कि इकाई को परिभाषित करने वाला कुछ मूल्य है लेकिन यह केवल माता-पिता के संदर्भ में मान्य है। – ali