2013-02-25 75 views
0

我在論壇上看過類似的問題,但還沒有找到任何解決我在找什麼(至少我可以告訴)。Mixing JOINED和SINGLE_TABLE使用註解的繼承

我有一種情況,我們有多個客戶端,每個客戶端有多個請求類型。我試圖完成的是有一個父表「請求」分裂成每個客戶端的子表 - 「ClientARequest」,「ClientBRequest」。從那裏,我會有多個映射到相同客戶端表的類。 「ClientARequest1」和「ClientARequest2」都映射到「ClientARequest」,ClientB類似。我可以得到第一部分JOINED繼承沒有問題。我可以得到第二個工作以及保存。然而,在提取時,hibernate正在創建最後一個映射類的實例,所以根據我如何使用提取的對象,我會得到一個ClassCastException,否則我將無法獲得正確的數據,因爲它是錯誤的類。

@Entity(name="Request") 
@Table(name = "REQUEST") 
@Inheritance(strategy=InheritanceType.JOINED) 
@DiscriminatorColumn(name="MY_TYPE", discriminatorType=DiscriminatorType.STRING) 
public class Request { ... } 

@Entity(name="ClientARequest1") 
@Table(name = "CLIENTAREQUEST") 
@DiscriminatorValue("ClientA") 
public class ClientARequest1 extends Request { ... } 

@Entity(name="ClientARequest2") 
@Table(name = "CLIENTAREQUEST") 
@DiscriminatorValue("ClientA") 
public class ClientARequest2 extends Request { ... } 

爲ClientB同樣的事情:

@Entity(name="ClientBRequest1") 
@Table(name = "CLIENTBREQUEST") 
@DiscriminatorValue("ClientB") 
public class ClientBRequest1 extends Request { ... } 

@Entity(name="ClientBRequest2") 
@Table(name = "CLIENTBREQUEST") 
@DiscriminatorValue("ClientB") 
public class ClientBRequest2 extends Request { ... } 

所以,就像我提到的,三個表,請求,ClientARequest和ClientBRequest創建,這是表之間discrimating沒有問題。當試圖從表中獲取hibernate使用第二映射來創建類的實例時。

Ex。

ClientARequest1 r = new ClientARequest1("ClientA"); 
dao.save(r); 

按預期工作。
然而,對於:

Request r = (Request) dao.findById(1l); //where id==1 is a ClientARequest1 

實際上會拉回來一ClientARequest2。

任何想法將不勝感激。這個解決方案是不是可行的,是否有辦法將表格分解到另一個級別?

13年2月26日11:19 EST:
我試圖在這個線程How to mix inheritance strategies with JPA annotations and Hibernate?的解決方案,但我不能子類BB1,BB2,CC1地圖,CC2正確,因爲它們的性能會放置在基父表A中。我希望它們的屬性分別放置在它們的直接父表BB,CC中。

回答