映射类继承---Hibernate实战(1)

具有继承关系的实体类的映射的表现有四种方法:
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

还有一种就是混合策略。
  

你可能感兴趣的:(数据结构,sql,Hibernate,xml,jpa)