JPA 中的继承映射

Inheritance Mapping in JPA

我正在研究 JPA specification 将继承关系映射到关系模型的可用策略。我没有完全理解规范中的以下陈述:

单个 Table 每个 Class 层次结构策略:

"This strategy provides good support for polymorphic relationships between entities and queries that cover the entire entity class hierarchy"

Table 每个具体 Class 策略:

"This strategy provides poor support for polymorphic relationships"

谁能进一步阐明这些关于多态性如何受这些策略影响的陈述的含义?

查看此页面,其中包含每个示例 http://www.datanucleus.org/products/accessplatform_4_1/jpa/orm/inheritance.html

根据具体 Class 策略考虑以下 example.The Table

此处每个具体 class 都映射为普通持久性 class。所以我们有 3 张桌子; PERSON、EMPLOYEE 和 OWNER 以保留 class 数据。在此子 class 的映射重复父 class.

的属性

这里你有一些缺点:

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

考虑我们有一个如下的领域模型

请研究下面提供的链接。

Single Table Strategy:

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

Joined Table Strategy

  • 实体数据存储在单独的tables
  • 需要连接才能插入和检索实体数据
  • 插入和检索变得繁重,因为需要连接
  • 保存数据库 space 因为列不需要可以为空

Joined table example

Table per concrete class - 同样,数据存储在多个 table 中,因此

Table per concrete class exmaple

这完全取决于您的要求。如果您有足够的数据库并且需要性能,那么 Single table 策略是可行的方法。如果你有数据库限制,那么其他策略将被遵循。

每个 Class 层次结构 Table

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

select a, b, c, type from table_c;

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

Table 每个混凝土 Class

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