我在論壇上看過類似的問題,但還沒有找到任何解決我在找什麼(至少我可以告訴)。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中。