2009-05-27 52 views
7

我有一個對象的字段可以是多個對象類型。這個對象被編碼在一個單獨的表中,該字段的子類型帶有一個鑑別器列。每個這些子類型都將其字段映射到父對象表中的列。我似乎無法在休眠模型中進行建模。無論表中有哪些子類型數據,下面的代碼將返回空值getSubfield()Hibernate嵌入式繼承

架構

 
    id type whosit whatsit 
+----+------+--------+---------+ 
| 1 | "A" | "test" | null | 
| 2 | "B" | null | "test" | 
+----+------+--------+---------+ 

域對象

@Entity 
public class Parent { 
    protected @Id @GeneratedValue int id; 
    protected Subfield subfield; 

    public Subfield getSubfield() {return subfield;} 
} 


@Embeddable 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING) 
public abstract class Subfield {} 


@DiscriminatorValue("A") 
public class TypeA extends Subfield { 
    public String whosit; 
} 


@DiscriminatorValue("B") 
public class TypeB extends Subfield { 
    public String whatsit; 
} 

「的選擇P從父P」

{id=1,subfield=null} 
{id=2,subfield=null} 

是否possib或者是否需要獲得更多的創造性(這是一個傳統數據庫,更改架構並不是首選)

+1

一位同事在工作中指向我http://opensource.atlassian.com/projects/hibernate/browse/HHH-1910。我想這是不支持= \ – 2009-05-28 16:59:48

回答

3

好吧,您不能輕易更改架構,但如何添加幾個視圖?

+1

好主意,不幸的是,它仍然是數據庫結構的修改。我試圖用代碼解決這個問題,如果沒有其他的東西,它似乎是冬眠可以做的事情,我很好奇我做錯了什麼。 – 2009-05-27 21:41:14

+1

+1對您的評論和提醒SO有時候,我們不能「做正確」並修復不良的模式設計。 :-) – cbmeeks 2013-04-18 20:07:08

1

我知道這是舊的。

解決這個問題的方法如上所述。創建一個視圖。你說你不想改變模式。那就不要。您可以創建一個新的模式,它映射舊的模式並執行所需的操作。 (可能取決於數據庫)