【问题标题】:JPA products DB model designJPA产品DB模型设计
【发布时间】:2013-05-20 20:20:17
【问题描述】:

我需要创建一个产品数据库。我的产品将具有共同的属性,例如价格、描述、品牌......以及特定的属性,具体取决于它们的类别(笔记本电脑将具有显示尺寸、内存、cpu 等)。

我的通用实体是:

@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 {
   // ...
}

我想查询我的 Product 实体以显示我的数据库中所有产品的表格列表。

我还希望显示“产品类型”列。

如何确定产品的子类型?是笔记本、电话还是其他类型的产品?

有一个鉴别器列,由 jpa 自动创建和管理,但是反向获取 Product 的类型的正确方法是什么?

如果这是不可能的,我该如何重新设计我的模型以实现我的目标?

【问题讨论】:

    标签: hibernate jakarta-ee database-design jpa jpa-2.0


    【解决方案1】:

    您可以同时将鉴别器列映射为属性(不可编辑)。所以Product 会有另一个属性:

    ...
    @DiscriminatorColumn(
      name="discriminator",
      discriminatorType=DiscriminatorType.STRING
    )
    @DiscriminatorValue(value="GEN")
    public class Product implements Serializable { 
    
      @Column(insertable=false, updatable=false)
      public String discriminator;
      ...
    }
    

    当您对Products 执行查询时,结果集也将包含Notebooks。

    【讨论】:

    • 谢谢。这对产品模型来说是一个好的设计吗?我还能做些什么来变得更聪明? :)
    • 您可能需要重新考虑继承策略。使用SINGLE_TABLE 策略,所有实体都将保存在一个表中,在您的情况下,该表将包含许多带有NULLs 的列。您可能想切换到JOINED 策略,但这也有其缺点。详情请看这里:en.wikibooks.org/wiki/Java_Persistence/Inheritance
    • 我认为这值得在另一个问题中提出:)
    • 我已经知道继承策略了。我的意思是……在这种情况下,我使用的是一种策略还是另一种都没有关系。我总是有同样的问题。您的回答很好,但想象一下:我在 jsf 数据表中显示“产品”查询。是的...我可以显示鉴别器列,但是如果我想确切地确定它是哪个 CLASS 实例...我该怎么做?
    • 我不知道 JSF,所以我无法回答如何做到这一点。但是您始终可以使用instanceof 运算符并检查层次结构中的每个类。取决于我猜的具体细节。这就是为什么我建议你打开另一个更详细的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多