मेरे पास एक अजीब समस्या है जहां हाइबरनेट अपेक्षाकृत इकाई प्रकार को कई से एक रिलायंसशिप में नहीं बनाता है।रिश्ते में गलत इकाई उप प्रकार का निर्माण करने के लिए हाइबरनेट
@Entity
@Table(name = "A")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING, length = 1)
public abstract class A {
@Id
...
public Long getId() { ... }
...
}
@Entity
@DiscriminatorValue("1")
public class A1 extends A {
...
}
@Entity
@DiscriminatorValue("2")
public class A2 extends A {
...
}
@Entity
@Table(name = "B")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING, length = 1)
public abstract class B<AClass extends A> {
protected AClass a;
@Id
...
public Long getId() { ... }
...
public abstract AClass getA();
public void setA(AClass a) { ... }
}
@Entity
@DiscriminatorValue("1")
public class B1 extends B<A1> {
...
@Override
@ManyToOne(fetch = EAGER)
@JoinColumn(name = "A_ID")
public A1 getA() { ... }
}
@Entity
@DiscriminatorValue("2")
public class B2 extends B<A2> {
...
@Override
@ManyToOne(fetch = EAGER)
@JoinColumn(name = "A_ID")
public A2 getA() { ... }
}
persistence.xml
में दोनों संस्थाओं के क्रम
A2
A1
B2
B1
अब मैं डीबी में A1 के उदाहरण और बी 1 बनाने घोषित किये गए हैं:
हम उपवर्ग पदानुक्रम के साथ निम्नलिखित संस्थाओं (सरलीकृत) हैA1 a1 = new A1();
entityManager.persist(a1);
B1 b1 = new B1();
b1.setA(a1);
entityManager.persist(b1);
मैं देख सकता हूं कि उदाहरण डीबी में सहेजे गए हैं, प्रत्येक में आईडी 1 है, डिस्क्रिमिनेटर भी 1 है, बी में ए_आईडी भी है 1.
जब मैं अब बी प्राप्त करने के लिए (एक और हाइबरनेट सत्र में) की कोशिश:
org.hibernate.PropertyAccessException: Exception occurred inside getter of B
Caused by: java.lang.ClassCastException: A2 cannot be cast to A1
at B1.getA(B1.java:61)
... 108 more
डिबगिंग के साथ
मुझे पता चला है कि हाइबरनेट का सही इकाई पैदा कर रही है:
B b = entityManager.find(B.class, 1L);
मैं अपवाद बी 1 टाइप करें और ए के संबंध के लिए टाइप ए 2 की गलत इकाई बनाता है। persistence.xml
में ऑर्डर बदल दिया गया है तो सही प्रकार ए 1 बनाया गया है। ऐसा लगता है कि हाइबरनेट इस मामले में किसी तालिका के डिस्क्रिमिनेटर कॉलम को खाते में नहीं लेता है लेकिन कॉन्फ़िगरेशन में घोषित पहली उपप्रकार बनाता है। इसे कैसे सुधारा जा सकता है? क्या एनोटेशन के साथ कुछ गड़बड़ है?
(मैं भी पहली बार में महाप्रकार बी में अपनी टिप्पणियों के साथ विधि getA()
के ठोस कार्यान्वयन किया था, लेकिन यह इसी तरह की समस्याओं की ओर जाता है।)
आपके उत्तर के लिए धन्यवाद। कल मुझे इसका परीक्षण करने का मौका मिला और यह सवाल के परिदृश्य में काम करता है :) – Gandalf