2013-05-20 68 views
0

我需要創建一個產品數據庫。我的產品將具有共同的屬性,例如價格,說明,品牌......以及具體的屬性,具體取決於它們的類別(筆記本電腦將具有顯示器尺寸,RAM,CPU等等)。JPA產品DB模型設計

我一般實體是:

@Entity 
@Table(name="products") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
    name="discriminator", 
    discriminatorType=DiscriminatorType.STRING 
) 
@DiscriminatorValue(value="GEN") 
public class Product implements Serializable { 
    // ... 
} 

和這裏的特定實體的例子:

@Entity 
@DiscriminatorValue("NB") 
public class Notebook extends Product { 
    // ... 
} 

我想查詢我的產品實體顯示在我的數據庫的所有產品的表列表。

我還希望顯示「產品類型」列。

如何確定產品的子類型? Wheter如果是筆記本,電話或其他類型的產品?

有一個鑑別器列,由jpa自動創建和管理,但什麼是正確的方式來獲得產品的類型?

如果這不可行,我該如何重新設計我的模型以實現我的目標?

回答

1

您可以將您的鑑別器列同時映射爲屬性(不可編輯)。所以Product將有另一個屬性:

... 
@DiscriminatorColumn(
    name="discriminator", 
    discriminatorType=DiscriminatorType.STRING 
) 
@DiscriminatorValue(value="GEN") 
public class Product implements Serializable { 

    @Column(insertable=false, updatable=false) 
    public String discriminator; 
    ... 
} 

當你執行了Product個查詢,結果集也將包含Notebook秒。

+0

謝謝。這對於產品模型來說是一個很好的設計嗎?我該怎麼做才能變得更聰明? :) –

+0

您可能想重新考慮繼承策略。使用'SINGLE_TABLE'策略,所有的實體將被保存在一個表中,在你的情況下,它將包含大量帶'NULL'的列。您可能想切換到「JOINED」策略,但這也有其缺點。看看這裏的細節:http://en.wikibooks.org/wiki/Java_Persistence/Inheritance – lunr

+0

而我認爲這值得在另一個問題:) – lunr