我使用Hibernate
第4版(在Spring MVC
內部)。有映射在一個表上使用DiscriminatorColumn
SINGLE_TABLE
戰略幾個繼承實體:通過ID加載實體與SINGLE_TABLE繼承
@Entity
@DiscriminatorColumn
@DiscriminatorOptions(force = true)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class A {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
...
}
@Entity
@DiscriminatorValue(value = "B")
public class B extends A {
...
}
@Entity
@DiscriminatorValue(value = "C")
public class C extends A {
...
}
考慮我有通用的GUI界面來管理這個實體,所以在輸入(在HttpServletRequest
說)我只有id
對象的 ,但我不知道這個對象究竟是哪一種類型;這就是爲什麼我無法指定session.load(...)
的確切等級。但對於特定部分,我需要訪問特定的實體字段,因此我必須將對象投射到精確類型(B
或C
)。
所以,當我在做A a = (A) session.load(A.class, id);
它構造下A
類型的代理對象,因此它不能被轉換爲B
或C
:
java.lang.ClassCastException: my.A_$$_jvst551_6 cannot be cast to my.B
的問題:是什麼辦法我怎麼可以配置我的實體還是使用特殊的技巧從數據庫加載實體並獲得哪些對應行呈現的精確類型的對象?