2012-08-24 77 views
1

我在webapp中使用toplink JPA,我只想將一個表映射到類層次結構。我想要一個類代表大部分數據,一個類繼承它(因此它獲得了超類的所有字段以及另外一些包含大量數據的類)。我一直不想要大量的數據,也不想讓它們保存在請求對象中等等。我只想在有人選擇其中一個摘要時使用大數據。我已經設置瞭如下的類(作爲示例簡化)。Toplink JPA繼承 - 摘要/詳細信息關係

@Entity 
@Table(name = "TRANSCRIPTS") 
@MappedSuperclass //also tried without this - same error 
public class Summary { 

    @Id 
    @Column(name = "id") 
    private long id; 
    @Column(name = "title") 
    private String title; 

    //rest of class etc. 
} 

@Entity 
@Table(name = "TRANSCRIPTS") 
public class Detail extends Summary { 

    @Id 
    @Column(name = "fullText") 
    private String fullText; 

    //rest of class etc. 
} 

當我嘗試並使用該層次結構中獲取數據,我相處的

Unknown column 'DTYPE' 

所以它在尋找一個descriminator列線的錯誤。我還沒有設置,因爲它不是那種關係。

有沒有一種不同的方式可以在JPA中映射此摘要/詳細信息關係?或者我應該放棄類繼承,並且有兩個單獨的不相關的類,一個表示摘要數據,一個表示全部數據(並重新定義摘要字段)。

謝謝。

回答

1

DTYPE它是Toplink試圖訪問以在您的實體之間進行選擇的鑑別器列, 如果將該列添加到您的表架構,它將開始工作。

DTYPE是INTEGER在數據庫中鍵入的列。

你可以使用下面的代碼片段指定自己的鑑別柱:

@Entity 
@DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.INTEGER) 
@DiscriminatorValue("1") 
class TestClass {} 

下面是一些文檔,你http://www.oracle.com/technetwork/middleware/ias/toplink-jpa-annotations-096251.html#CHDJHIAG

+0

所以我只需要此列存在,它沒有做什麼? – ssloan

+0

它將幫助toplink瞭解數據庫表中的哪一行屬於您的類中的哪個實體。它將包含您將在@DiscriminatorValue註釋中輸入的生成值或值。它稱爲鑑別器列。 –

+0

但是每行都與兩個類有關 - 類表示相同的數據項,只是它的一個子集。這不是像表1代表一般人,表2代表教師,我希望爲教師提供一個班級和一個班級。所以就數據庫而言,沒有任何區別。所有行在此列中都具有相同的值。 – ssloan