具有继承关系的实体类的映射的表现有四种方法:
1)每个带有隐式多态的而具体类一张表---使用非显示的继承映射和默认的运行时多态行为
即每个子类一张表,并且父类的所有属性在每个子类里面都有对应列。
主要问题在于,不太支持多态关联。还有就是多态查询。针对基类的查询必须作为几个SQL SELECT执行,每个具体子类一个。
XML描述符中,Hibernate没有什么特殊设置,就像每个子类和一般的实体类没区别一样设置。
对应的JPA:基类用@MappedSuperclass注解;可以为抽象类
具体子类可以用@AttributeOverride注解来覆盖来自超类的列映射。
XML描述符中,有<mapped-superclass class="......" access="FIELD">....</mapped-superclass>
2)每个具体类一张表.
和1)一样,每个具体子类有一张表,但是它们的配置文件不一样
Hibernate:用<union-subclass>继承策略
<class name="baseClass" abstract="true"><id ....></id><property..../>
<union-subclass name="sub-classA" table="A">....</union-subclass>
<union-subclass name="sub-classB" table="B">....</union-subclass>
</class>
JPA注解中,这个策略称作TABLE_PER_CLASS
数据库标识符和它的映射必须出现在超类中,在所有子类和它们的表中共享。
XML描述符中
<entity class="baseClass" access="FIELD">
<inheritance strategy="TABLE_PER_CLASS"/>
......
</entity>
<entity class="sub-classA" access="FIELD"/>
<entity class="sub-classB" access="FIELD"/>
如果超类是具体的,则需要另外一张表来存放这个类的实例。
对多台查询很有好处,如查找baseClass,它会把sub-classA和sub-classB都查出来union结果。
3)每个类层次结构一张表 --- 利用保存类型信息的一个类型辨别标志列
即把所有子类的所有属性的列都包括在同一个表中,由特定行表示的具体子类通过一个类型辨别标识列的值来进行识别。
问题就是有某些列不属于某个子类,而只属于别的子类。并且子类声明的属性的列必须声明可以为空。
Hibernamte XML描述符
<class name="baseClass" table="TableBase">
<discriminator column="typeA" type="String" />
<subclass name="sub-classA" discriminator-value="A">....</subclass>
<subclass name="sub-classB" discriminator-value="B">....</subclass>
</class>
JPA XML描述符:---对应的策略是SINGLE_TABLE
<entity class="baseClass" access="FIELD">
<inheritance strategy="SINGLE_TABLE"/>
<discriminator-column name="columnA" discriminator-tpe="STRING"/>
...
</entity>
<entity class="sub-classA" access="FIELD">
<discriminator-value>A</discriminator-value>
.....
</entity>
4)每个子类一张表
即把继承关系表示为相关的外键关联。声明持久化属性的每个类/子类(包括抽象类甚至接口)都有它自己的表。该表仅仅包含了每个非继承的属性(由子类本身声明的每个属性)以及也是超类表的外键的主键的列。即子表的主键是父表的外键。
Hibernate用<joined-subclass>元素给每个子类映射创建一张表。
<class name="baseClass" table="baseTable">
....
<joined-subclass name="subClassA" table="tableA">
<key column="columnA" />
.......
</class>
当查询基类时候,依赖于外部联接(left join)
JPA中对应的策略就是JOINED
还有一种就是混合策略。
1)每个带有隐式多态的而具体类一张表---使用非显示的继承映射和默认的运行时多态行为
即每个子类一张表,并且父类的所有属性在每个子类里面都有对应列。
主要问题在于,不太支持多态关联。还有就是多态查询。针对基类的查询必须作为几个SQL SELECT执行,每个具体子类一个。
XML描述符中,Hibernate没有什么特殊设置,就像每个子类和一般的实体类没区别一样设置。
对应的JPA:基类用@MappedSuperclass注解;可以为抽象类
具体子类可以用@AttributeOverride注解来覆盖来自超类的列映射。
XML描述符中,有<mapped-superclass class="......" access="FIELD">....</mapped-superclass>
2)每个具体类一张表.
和1)一样,每个具体子类有一张表,但是它们的配置文件不一样
Hibernate:用<union-subclass>继承策略
<class name="baseClass" abstract="true"><id ....></id><property..../>
<union-subclass name="sub-classA" table="A">....</union-subclass>
<union-subclass name="sub-classB" table="B">....</union-subclass>
</class>
JPA注解中,这个策略称作TABLE_PER_CLASS
数据库标识符和它的映射必须出现在超类中,在所有子类和它们的表中共享。
XML描述符中
<entity class="baseClass" access="FIELD">
<inheritance strategy="TABLE_PER_CLASS"/>
......
</entity>
<entity class="sub-classA" access="FIELD"/>
<entity class="sub-classB" access="FIELD"/>
如果超类是具体的,则需要另外一张表来存放这个类的实例。
对多台查询很有好处,如查找baseClass,它会把sub-classA和sub-classB都查出来union结果。
3)每个类层次结构一张表 --- 利用保存类型信息的一个类型辨别标志列
即把所有子类的所有属性的列都包括在同一个表中,由特定行表示的具体子类通过一个类型辨别标识列的值来进行识别。
问题就是有某些列不属于某个子类,而只属于别的子类。并且子类声明的属性的列必须声明可以为空。
Hibernamte XML描述符
<class name="baseClass" table="TableBase">
<discriminator column="typeA" type="String" />
<subclass name="sub-classA" discriminator-value="A">....</subclass>
<subclass name="sub-classB" discriminator-value="B">....</subclass>
</class>
JPA XML描述符:---对应的策略是SINGLE_TABLE
<entity class="baseClass" access="FIELD">
<inheritance strategy="SINGLE_TABLE"/>
<discriminator-column name="columnA" discriminator-tpe="STRING"/>
...
</entity>
<entity class="sub-classA" access="FIELD">
<discriminator-value>A</discriminator-value>
.....
</entity>
4)每个子类一张表
即把继承关系表示为相关的外键关联。声明持久化属性的每个类/子类(包括抽象类甚至接口)都有它自己的表。该表仅仅包含了每个非继承的属性(由子类本身声明的每个属性)以及也是超类表的外键的主键的列。即子表的主键是父表的外键。
Hibernate用<joined-subclass>元素给每个子类映射创建一张表。
<class name="baseClass" table="baseTable">
....
<joined-subclass name="subClassA" table="tableA">
<key column="columnA" />
.......
</class>
当查询基类时候,依赖于外部联接(left join)
JPA中对应的策略就是JOINED
还有一种就是混合策略。