मैं बाल entites ir से ParentEntities संदर्भित के बारे में एक प्रश्न पूछना चाहते हैं तो मैं कुछ इस तरह है:जेपीए @OneToMany -> जनक - बाल संदर्भ (विदेशी कुंजी)
Parent.java:
@Entity(name ="Parent")
public class Parent {
@Id
@Generate.....
@Column
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "parent")
private Set<Child> children;
simple ... getter and setter ...
}
और Child.java:
@Entity(name ="Child")
public class Child{
@Id
@Generate....
@Column
private int id;
@ManyToOne
private Parent parent;
... simple getter an setter
}
निम्न तालिकाओं बनाया जा जा रहे हैं:
Parent:
int id
Child:
int id
int parent_id (foreign key: parent.id)
ठीक है, अब तक, हमेशा के लिए ठीक है। लेकिन जब जावा से इस संदर्भ का उपयोग करने की बात आती है, तो मुझे लगता है, आप ऐसा कुछ कर सकते हैं।
@Transactional
public void test() {
Parent parent = new Parent();
Child child = new Child();
Set<Child> children = new HashSet<Child>();
children.add(child);
parent.setChildren(children);
entityManager.persist(parent);
}
जो डाटाबेस में इस की ओर जाता है:
Parent:
id
100
Child
id paren_id
101 100
लेकिन मामला नहीं thats, आप स्पष्ट रूप से करने के लिए है बाल (जो, मुझे लगता है कि होता है, ढांचा शायद द्वारा कर सकता करने के लिए माता पिता के सेट अपने आप)।
तो सच में डेटाबेस में यह है क्या:
Parent:
id
100
Child
id paren_id
101 (null)
कारण मैं बच्चे को जनक सेट नहीं किया है। तो मेरा प्रश्न:
क्या मुझे वास्तव में sth करना है। इस तरह?
Parent.java:
...
setChildren(Set<Child> children) {
for (Child child : children) {
child.setParent.(this);
}
this.children = children;
}
...
संपादित करें:
तेजी से जवाब के अनुसार मैं संदर्भ-स्वामित्व इकाई पर @JoinColumn का उपयोग करके इस समस्या को हल करने में सक्षम था। अगर हम ऊपर से उदाहरण लेते हैं, तो मैंने sth किया था। इस तरह:
Parent.java:
@Entity(name ="Parent")
public class Parent {
@Id
@Generate.....
@Column
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name= "paren_id")
private Set<Child> children;
simple ... getter and setter ...
}
और Child.java:
@Entity(name ="Child")
public class Child{
@Id
@Generate....
@Column
private int id;
... simple getter an setter
}
अब हम ऐसा करते हैं:
@Transactional
public void test() {
Parent parent = new Parent();
Child child = new Child();
Set<Child> children = new HashSet<Child>();
children.add(child);
parent.setChildren(children);
entityManager.persist(parent);
}
संदर्भ सही ढंग से सेट किया गया है अभिभावक:
Parent:
id
100
Child
id paren_id
101 100
उत्तर के लिए धन्यवाद।
** क्या आपके पास बच्चे की इकाई पर अभिभावक है? ** यदि हां, तो उन्होंने कैसे कॉन्फ़िगर किया।किसी भी माता-पिता के साथ मुझे त्रुटि मिलती है (_StaleStateException: बैच अपडेट अद्यतन से अप्रत्याशित पंक्ति गणना लौटाता है [0]; वास्तविक पंक्ति गणना: 0; अपेक्षित: 1_)। अगर मैं बिना किसी एनोटेशन के माता-पिता जोड़ता हूं तो यह त्रुटि भी दिखाता है (मैपिंग त्रुटि)। बच्चे के मूल क्षेत्र पर @manytoone सेटिंग के साथ मुझे सहेजने में त्रुटि मिलती है (_ORA-00904: "REPORT_REPORT_ID": недопустимый идентификатор_)। आईडी पर मेरा एफके और उसका पीके report_id नाम है लेकिन मुझे नहीं पता कि report_report_id कहां आता है। – Erlan
(एक्लिप्ससेंक जेपीए कार्यान्वयन का उपयोग करना)। यह ध्यान देने योग्य है कि आपको अभी भी @ कॉलम (नाम = "paren_id") निजी लंबे माता-पिता की आवश्यकता है; इस wot काम के लिए अपने बच्चे पर मैपिंग। – AfterWorkGuinness