2016-04-15 57 views
0

我使用Hibernate第4版(在Spring MVC內部)。有映射在一個表上使用DiscriminatorColumnSINGLE_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(...)的確切等級。但對於特定部分,我需要訪問特定的實體字段,因此我必須將對象投射到精確類型(BC)。

所以,當我在做A a = (A) session.load(A.class, id);它構造下A類型的代理對象,因此它不能被轉換爲BC

java.lang.ClassCastException: my.A_$$_jvst551_6 cannot be cast to my.B

的問題:是什麼辦法我怎麼可以配置我的實體還是使用特殊的技巧從數據庫加載實體並獲得哪些對應行呈現的精確類型的對象?

回答

0

好吧,很簡單:我應該使用session.get(A.class, id)而不是session.load(...)