JPA中的继承映射

时间:2015-04-02 08:54:14

标签: java hibernate jpa inheritance

我正在通过可用策略的JPA specification来将继承关系映射到关系模型。我并不安静地理解规范中的以下陈述:

每个类层次结构策略的单个表:

“此策略为覆盖整个实体类层次结构的实体和查询之间的多态关系提供了良好的支持”

每个具体课程策略表

“这种策略对多态关系提供的支持很少”

任何人都可以进一步澄清这些关于多态性如何受这些策略影响的陈述的含义吗?

4 个答案:

答案 0 :(得分:4)

考虑我们有一个域模型如下 enter image description here

请研究下面提供的链接。

<强> Single Table Strategy

enter image description here

  • 所有数据都存储在单个表格中
  • 因此,在检索或插入数据时不需要复杂的连接
  • 多态意味着多个实体,在单个表中,所有实体都存储在一个表中。因此不需要加入
  • 但这会浪费数据库空间,因为列需要可以为空 single table example

<强> Joined Table Strategy enter image description here

  • 实体数据存储在单独的表中
  • 需要联接才能插入和检索实体数据
  • 插入和检索变得很重,因为需要连接
  • 保存数据库空间,因为列不必为可空

Joined table example

<强> Table per concrete class enter image description here   - 同样,数据存储在多个表中,因此

Table per concrete class exmaple

这完全取决于您的要求。如果您有足够的数据库并且需要性能,那么单表策略就是您的选择。如果您有数据库约束,则应遵循其他策略。

答案 1 :(得分:2)

考虑以下示例。每个具体类别策略的表格

enter image description here

这里将每个具体类映射为普通的持久类。所以我们有3张桌子; PERSON,EMPLOYEE和OWNER持有班级数据。在此,子类的映射重复父类的属性

这里有一些缺点:

  1. 如果您对父类进行任何更改会反映到大量表
  2. 根据父类进行的查询可能会导致大量的选择操作
  3. 属于父类的数据分散在许多子类表中,这些表代表具体的类。

答案 2 :(得分:0)

答案 3 :(得分:0)

每个类层次结构的单个表

此策略在实体和查询之间提供了良好的多态关系,因为JPA可以通过其DiscriminatorValue预测查询的实体。例如,假设您有一个这样的实体。

select a, b, c, type from table_c;

并且通过使用JPA,您可以获得A类或B类,即使您正在使用table_c,也可以通过在该表中添加新列来更轻松地创建新实体。 (这是人们通常所说的Denormalisation

每个具体类别的表格

这种策略对多态关系的支持很差,因为一​​个表只适用于一个类。这意味着如果您需要创建一个新实体,那么您应该创建一个新表。