Hazırda bekletme durumunun çoktan tekil bir ilişkide beklenen varlık türünü yaratmadığı garip bir sorun var. persistence.xml
yılındaHazırda yanlış varlık alt türü oluşturma hazırda beklemede
@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() { ... }
}
her iki tarafın
A2
A1
B2
B1
Şimdi DB A1 örneklerini ve B1 oluşturmak amacıyla ilan edilir:
Biz (basitleştirilmiş) alt sınıf hiyerarşisi ile aşağıdaki varlıklara sahipA1 a1 = new A1();
entityManager.persist(a1);
B1 b1 = new B1();
b1.setA(a1);
entityManager.persist(b1);
Örneklerin her biri kimlik 1'e sahip olan DB'ye doğru kaydedildiğini görüyorum, AYRIMCI ayrıca 1, B'de de A_ID 1'dir.
Şimdi (başka hazırda oturumda) B almaya çalıştığınızda: Ben hazırda doğru bir varlık yaratıyor öğrendim ayıklama ile
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);
özel durum almak B1 yazın ve A ile ilişki için A2 türünde yanlış bir öğe oluşturur. persistence.xml
'daki sipariş değiştiyse doğru tip A1 oluşturulur. Hazırda bekletme, bu durumda A tablosunun DISCRIMINATOR sütununu dikkate almaz gibi görünüyor, ancak her zaman yapılandırmada bildirilen ilk alt türü oluşturur. Bu nasıl düzeltilebilir? Ek açıklamalarla ilgili bir sorun mu var?
getA()
somut uygulama vardı, ama bu benzer sorunlara yol açar.)
Cevabınız için teşekkür ederiz. Dün bunu test etme şansım oldu ve bu sorunun senaryosunda çalışıyorum :) – Gandalf