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.
的属性
这里你有一些缺点:
- 如果您对父表进行任何更改 class 会反映到大量表中
- 根据父 class 表达的查询可能会导致大量 select 操作
- 属于父 class 的数据分散在多个子class 表中,代表具体的 classes。
考虑我们有一个如下的领域模型
请研究下面提供的链接。
- 所有数据都存储在单个table
- 因此在检索或插入数据时不需要复杂的连接
- 多态意味着多个实体,在单个 table 中,所有这些都存储在一个 table 中。因此不需要加入
- 但这会浪费数据库 space,因为列需要可以为空
single table example
- 实体数据存储在单独的tables
- 需要连接才能插入和检索实体数据
- 插入和检索变得繁重,因为需要连接
- 保存数据库 space 因为列不需要可以为空
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.
我正在研究 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.
的属性这里你有一些缺点:
- 如果您对父表进行任何更改 class 会反映到大量表中
- 根据父 class 表达的查询可能会导致大量 select 操作
- 属于父 class 的数据分散在多个子class 表中,代表具体的 classes。
考虑我们有一个如下的领域模型
请研究下面提供的链接。
- 所有数据都存储在单个table
- 因此在检索或插入数据时不需要复杂的连接
- 多态意味着多个实体,在单个 table 中,所有这些都存储在一个 table 中。因此不需要加入
- 但这会浪费数据库 space,因为列需要可以为空 single table example
- 实体数据存储在单独的tables
- 需要连接才能插入和检索实体数据
- 插入和检索变得繁重,因为需要连接
- 保存数据库 space 因为列不需要可以为空
Table per concrete class
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.