У меня есть 2 абстрактных класса, A & G, и у каждого есть 2 класса реализации
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
abstract class A {
@Id
protected String id;
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
abstract class G<T extends A> {
@Id
protected String id;
@OneToOne(cascade = CascadeType.ALL)
protected T theA;
}
// ------------------- implemenation classes -------------------
@Entity
@DiscriminatorValue("1")
class A1 extends A {
}
@Entity
@DiscriminatorValue("2")
class A2 extends A {
}
@Entity
@DiscriminatorValue("1")
class G1 extends G<A1> {
}
@Entity
@DiscriminatorValue("2")
class G2 extends G<A2> {
}
// ---------------------- Test codes ----------------------
A2 a2 = new A2();
G2 g2 = new G2();
g2.setTheA(a2);
entityManager.persist(g2);
И я проверил БД, поле «тип» таблицы «G» равно 2, как и ожидалось, но «тип» в таблице «А» равно 1, поэтому, если я найду (G2.class, theID). getTheA (), будет ClassCastException: приведение A1 к A2
Может ли это быть из-за общего в классе G, или это неправильный дизайн класса?