मैं वर्तमान में जेपीए हाइबरनेट को EclipseLink का उपयोग करने से एक (कार्य) एप्लिकेशन को चलती हूँ, ज्यादातर यह काफी आसानी से चला गया, लेकिन मैं कर सकते हैं एक बात है कि मैं व्याख्या नहीं कर सकते खोजने कर रहा हूँ, और भी किसी भी अच्छे खोज शब्द के बारे में सोचो मत!हाइबरनेट जेपीए - ManyToOne संबंध आबादी नहीं
असल में, मैं चार संस्थाओं, एक-से-कई रिश्तों को एक श्रृंखला के गठन के साथ है:
EntityA EntityB की, जिनमें से प्रत्येक EntityC के की एक सूची है, जिनमें से प्रत्येक EntityD के की एक सूची है की एक सूची है
उन लोगों में सेप्रत्येक फिर एक कई-से-एक संबंध अन्य रास्ते पर जा रहा है, तो:
EntityD एक EntityC है, जो एक EntityB है, जो एक EntityA है है है।
है कि (भारी स्पष्टता के लिए कम):
@Entity
public class EntityA {
@OneToMany (cascade = CascadeType.All, mappedBy = "entityA")
private List<EntityB> entityBList;
...
}
@Entity
public class EntityB {
@OneToMany (cascade = CascadeType.All, mappedBy = "entityB")
private List<EntityC> entityCList;
@JoinColumn (name = "ENTITY_A", referencedColumnName = "ENTITY_A_ID")
@ManyToOne (cascade = CascadeType.PERSIST, optional = false)
private EntityA entityA;
}
@Entity
public class EntityC {
@OneToMany (cascade = CascadeType.ALL, mappedBy = "entityC")
private List<EntityD> entityDList;
@JoinColumn (name = "ENTITY_B", referencedColumnName = "ENTITY_B_ID")
@ManyToOne (cascade = CascadeType.PERSIST, optional = false)
private EntityB entityB;
}
@Entity
public class EntityD {
@JoinColumn (name = "ENTITY_C", referencedColumnName = "ENTITY_C_ID")
@ManyToOne (cascade = CascadeType.PERSIST, optional = false)
private EntityC entityC;
}
मैं डेटाबेस से एक EntityA मिल (यह देख ऊपर अपने प्राथमिक कुंजी द्वारा), और इस प्रकार के लिए एक PersistentBag के साथ, एक अच्छी तरह से आबादी EntityA उदाहरण मिल मेरा List<EntityB>
। मैं एक आलसी लोड हो रहा है जब मुझे लगता है कि List<EntityB>
भिन्नता देखते हैं, और एक ही EntityB से EntityCs प्राप्त करने के लिए बार-बार।
इस बिंदु पर, सबकुछ मुझे उम्मीद है, मेरे पास एक एंटिटीए, बी और सी डेटाबेस से मूल्यों के साथ पूरी तरह से आबादी है, लेकिन फिर मैं एंटीटीसी से अपना एंटिटीडी प्राप्त करने का प्रयास करता हूं, और यह पता चला कि यह शून्य है।
मेरा इकाई प्रबंधक अभी भी इस बिंदु पर खुला और सक्रिय है, और अगर मैं इसे एंटिटीए प्राप्त करने के तुरंत बाद डीबगर में देखता हूं, तो मैं एंटिटीसी तक रिश्तों के माध्यम से चल सकता हूं, और फिर 'इकाई डीलिस्ट' देख सकता हूं 'शून्य के रूप में।
EntityManager.refresh(entityC);
जो entityDList के लिए एक lazily-लोडेड PersistentBag सहित अपने सभी तत्वों को भरता है:
एकमात्र समाधान मैं अब तक मिल गया है उपयोग करने के लिए है।
तो, मेरा अनुमान है कि हाइबरनेट केवल 2 स्तरों को गहराई से संदर्भित करता है (या 3, आप कैसे गिनते हैं इसके आधार पर), और उसके बाद छोड़ देते हैं, हालांकि मुझे वास्तव में समझ में नहीं आता कि यह क्यों होगा। क्या यह किसी के लिए समझ में आता है?
वहाँ .refresh के अलावा कोई समाधान अन्य है? कुछ प्रकार की कॉन्फ़िगरेशन या एनोटेशन वैल्यू जो हाइबरनेट को संदर्भों को सभी तरह से पॉप्युलेट कर देगा?
हाइबरनेट कॉन्फ़िगरेशन पैरामीटर "max_fetch_depth" के लिए मान सेट क्या है? –