जेपीए 1 (हाइबरनेट-कोर संस्करण 3.3.0.एसपी 1 और हाइबरनेट-इकाई प्रबंधक संस्करण 3.4.0.GA) के साथ काम करना: मेरे पास नीचे दी गई परिभाषाओं के समान कुछ संस्थाएं हैं, जहां चाइल्डऑन और चाइल्डटो से विस्तारित है पिता इकाईजेपीए विरासत मुद्दा
@Entity
@Table(name = "TABLE_FATHER")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.INTEGER, name = Father.C_ID_CTG)
public class Father {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "sq")
@Column(name = "ID_PK", nullable = false)
@BusinessId
private Long id;
...
}
@Entity
@Table(name = "TABLE_CHILD_ONE")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue(Categories.ID_CTG_ONE)
public class ChildOne extends Father {
...
}
@Entity
@Table(name = "TABLE_CHILD_TWO")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorValue(Categories.ID_CTG_TWO)
public class ChildTwo extends Element {
...
}
मान लें कि मेरे पास एक इकाई है जिसमें पिता तत्व है, और दूसरा पिता तत्वों का संग्रह है। दोनों मामलों में, बच्चों की संस्थाओं को जाना चाहिए।
@Entity
@Table(name = "TABLE_ONE")
public class OneTable {
@JoinColumn(name = "ID_PK", referencedColumnName = "ID_PK", nullable = false)
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private Father element;
...
}
@Entity
@Table(name = "TABLE_ANOTHER")
public class Another {
@Fetch(FetchMode.JOIN)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "id", fetch = FetchType.LAZY)
private Collection<Father> elementCollection;
...
}
मैं हमेशा बच्चों तत्वों प्राप्त करने के लिए उम्मीद कर रहा हूँ, लेकिन जब मैं तत्व getElement()
पिता तत्व वापस आती है और दूसरी तरफ, जब मैं संग्रह getElementCollection()
बच्चों तत्वों आ रहे हैं मिलता है मिलता है।
जाहिर है, @JoinColumn
इस व्यवहार का कारण है, पिता की मेज के साथ जुड़ना और बच्चों के तत्वों को भूलना। संग्रह अपेक्षित के रूप में काम कर रहा है।
मैं getElement()
कॉल के साथ बच्चों के तत्व को कैसे प्राप्त कर सकता हूं? कोई विचार या कामकाज? अग्रिम धन्यवाद।
अच्छा बिंदु। मुझे कुछ चीजों को आज़माएं और मैं आपको बता दूंगा ... – elcadro
आपके उत्तर के बारे में कुछ ही नोट्स ... जहां तक मुझे पता है कि spec को जॉइनेड विरासत को लागू करने के लिए भेदभाव कॉलम का उपयोग करने के लिए कार्यान्वयन की आवश्यकता नहीं है, हालांकि, धारणा यह है कि यदि @DiscriminatorColumn निर्दिष्ट किया गया है तो इसका उपयोग किया जाएगा ... दूसरी तरफ, आपका समाधान वास्तव में काम करता है, फिर भी कुछ संदेह हैं। यह जानकर कि आलसी प्रॉक्सी देता है, क्यों कई लोग एक माता-पिता को प्रॉक्सी वापस भेजते हैं (jpa.inheritance.issue.Parent _ $$ _ javassist_1), और वनटॉनी संग्रह बच्चों प्रॉक्सी (jpa.inheritance.issue.ChildOne _ $$ _ javassist_1) ??? – elcadro
असली दुनिया में 'getElement()' कॉल का सटीक वापसी प्रकार निर्धारक नहीं है।कारण अगर ऑब्जेक्ट 1 या 2 स्तर के कैश में पाया जाता है तो यह 'चाइल्ड' टाइप करेगा। यही कारण है कि मैं विशिष्ट व्यवहार को इंगित करने के लिए मध्य में 'em.clean()' को कॉल करता हूं। यही कारण है कि यह प्रकार अभिभावक-बच्चे पदानुक्रम के साथ स्थिति में नास्तिक होने के लिए सबसे अच्छा है है। यदि आप वास्तव में उत्सुक करने के लिए एक सही प्रकार आप "unproxy" के रूप में मैं प्रस्तावित कर सकते हैं या बेहतर परिवर्तन FetchType जरूरत है (के रूप में "unproxying" वैसे भी संबंध लोड)। – zbig