2010-07-24 16 views
8

मैं मुसीबत कुछ संस्थाओं के लिए जेपीए मैपिंग की स्थापना कर रहा हूँ हाइबरनेट। मेरे पास निम्न की तरह परिभाषित एक मूल इकाई है।जेपीए समग्र विदेशी कुंजी मानचित्रण

@Entity 
@Table(name="EIF_INSTANCE_HDR") 
public class InstanceEntity implements Serializable{ 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(generator="eif_inst_gen") 
@SequenceGenerator(name="eif_inst_gen",sequenceName="EIF_INSTANCE_SEQ") 
@Column(name = "EAIH_ID") 
private Long eaihid; 
@Column(name = "EAD_ID") 
private Long eadid; 

@OneToMany(targetEntity=InstanceNotifyEntity.class, mappedBy="instance",fetch=FetchType.EAGER, cascade = CascadeType.ALL) 
private List<InstanceNotifyEntity> userDetails = new ArrayList<InstanceNotifyEntity>(); 
} 

इस प्रकार मैं तो एक बच्चे इकाई डब्ल्यू/एक समग्र कुंजी है, और इस तालिका के प्राथमिक कुंजी के लिए एक विदेशी कुंजी है:

@Entity 
@Table(name="EIF_INST_NOTIFIED") 
public class InstanceNotifyEntity implements Serializable{ 

private static final long serialVersionUID = 1L; 

@Id 
@ManyToOne 
@JoinColumn(name="EAIH_ID", referencedColumnName="EAIH_ID") 
private InstanceEntity instance; 

@Id 
@Column(name="USER_ID") 
private Long userId; 
@Column(name="COMMENT_TXT") 
private String commentText; 
} 

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

किसी भी मदद की सराहना की है।

+0

देखें http://stackoverflow.com/questions/2562746/jpa-entity-design-problem/ 2563009 # 2563009 – axtavt

उत्तर

12

यह JPA 2 spec खंड 2.4.1 द्वारा संचालित होता है, "प्राथमिक कुंजी व्युत्पन्न पहचान के अनुरूप"। इस अनुभाग में आपकी समस्या के लिए सीधे दो उदाहरण शामिल हैं।

  • @IdClass
  • @EmbeddedId

यहाँ EmbeddedId रास्ते से एक स्केच है:

कल्पना में वर्णित है, इस मामले में बच्चे को इकाई के प्रमुख का प्रतिनिधित्व करने के दो तरीके हैं। मैं EmbeddedId मनमाने ढंग से चुना है, लेकिन IdClass और EmbeddedId के बीच विकल्प महत्वपूर्ण है। आप अलग-अलग चुन सकते हैं।

// Child entity's composite primary key 
@Embeddable 
public class InstanceNotifyEntityId implements Serializable { 
    Long eaihId; 
    Long userId; 
} 

// Child entity 
@Entity 
@Table(name="EIF_INST_NOTIFIED") 
public class InstanceNotifyEntity implements Serializable { 
    @AttributeOverrides({ 
     @AttributeOverride(name="userId", column = @Column(name="USER_ID")) 
     @AttributeOverride(name="eaihId", column = @Column(name="EAIH_ID")) 
    }) 
    @EmbeddedId 
    InstanceNotifyEntityId id; 

    @MapsId("eaihId") 
    @ManyToOne 
    InstanceEntity instance; 

    // ... 
} 

मूल इकाई एक परिवर्तन की जरूरत है: userDetails विशेषता mappedBy "id.eaihId" होना चाहिए। मुझे लगता है कि यह है, लेकिन मैंने पहले इस तरह की इकाइयों का उपयोग नहीं किया है। शायद कुछ याद आ गया है ... यदि आप त्रुटियों को देखते हैं तो कृपया पोस्ट करें।

+0

धन्यवाद, यह सबसे अधिक भाग के लिए काम करता है। दुर्भाग्यवश मैं jpa 2.0 का उपयोग नहीं कर रहा हूं इसलिए @MapsId एनोटेशन उपलब्ध नहीं है। मेरे पास यह मूल इकाई उपयोगकर्ता डेटा ऑब्जेक्ट से कैस्केड रिलेशनशिप को हटाकर आवेषण के लिए काम कर रहा है। तो मुझे मूल तत्व को बनाए रखने के बाद प्रत्येक बच्चे तत्व को सम्मिलित करने की आवश्यकता है, लेकिन यह अभी के लिए काम करने योग्य है। – broschb

+0

@broschb आप क्या उपयोग कर रहे हैं? –

+0

जेपीए 1.0 spec। वर्तमान में मुझे jboss 4.2.3 का उपयोग करने की आवश्यकता है, मेरी समझ है कि जेपीए 2.0 इस ऐप सर्वर पर काम नहीं करेगा, कम से कम पुस्तकालयों के समूह को अलग किए बिना नहीं। – broschb

0

मुझे भी एक ही समस्या का सामना करना पड़ रहा था और इस उत्तर का पालन किया गया लेकिन यह मूल इकाई के साथ बाल इकाई को नहीं बचा रहा है। यहां दिए गए परिवर्तन हैं और यह ठीक काम कर रहा है। परिवर्तन नीचे हैं -

// Child entity's composite primary key class 

public class InstanceNotifyEntityId implements Serializable { 

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

    @JoinColumn(name = "EAIH_ID") 
    @ManyToOne 
    InstanceEntity instance 
} 

// Child entity which contain composite primary key as a EmbeddedId, 
// no need to define any relationship here as we already define 
// the relationship in composite key class. 

@Entity 
@Table(name = "EIF_INST_NOTIFIED") 
public class InstanceNotifyEntity implements Serializable { 

    @EmbeddedId 
    InstanceNotifyEntityId id; 
} 


// Parent entity (parent entity mappedby should be your composite 
// key class instance.child class object which already have the 
// join column mapping with "EAID_ID") 

@Entity 
@Table(name = "EIF_INSTANCE_HDR") 
public class InstanceEntity implements Serializable { 

    @OneToMany(mappedBy = "id.instance,fetch=FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<InstanceNotifyEntity> userDetails = new ArrayList<InstanceNotifyEntity>(); 
} 

बचत जबकि मूल इकाई id.setInstance(parent entire obj) तरह समग्र कुंजी में पैरेंट ऑब्जेक्ट सेट

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