Hibernate之继承映射

Hibernate的继承映射可以理解为两个持久化类之间的继承关系    例如老师和人之间的关系 

持久化类  Person类

public  class  Person

{

      private   Integer    id;

      privvate  String     name;

      private    String    sex;

      public   Person (){}                //  无参构造器

      public   Person(Integer id,String  name, String sex)           // 带参数的构造器

      {

            this.id = id;

            this.name = name;

            this.sex   =  sex;

      }

      .............                                           //省略   id属性  name属性  sex属性  的 setter和getter方法

}

持久化  Teacher类  

public  class   Teacher   extends   Person

{                                                           //  继承了父类的全部Field  

        private   String   className;          //所带班级名

        private   String   subject;               //所教科目名

        public   Teacher(){}                       //无参构造器  

        public   Teacher(String id,Sting  name ,String  sex,String  className, String subject)

        {

              super(id,name,sex);                     //显示调用父类带三个参数的构造器

              this.className  = className;

              this.subject  =  subject;

        }

         ........//    继承了父类的getter和 setter方法  省略className属性  subject属性的getter和setter方法

}

有三种方式的继承映射 :

1.采用<subclass>元素的继承映射  

  在这种映射策略下,持久化父类  和 持久化子类 的实例对应的记录都将保存在一张数据表中。该数据表中额外需要增加一个数据列来记录该行记录是哪个类的实例。

  这个列被称为辨别者列(discriminator).

  该数据表有父类和所有子类的所有属性所对应的数据列   ,哪个对象实例如果没有该列的属性 ,则这个对象实例的对应记录的这列为null

  映射文件配置如下 :

<class  name="org.lingtong.pojo.Person" table="tb_person_info"  discriminator-value="普通人">            //discriminator-value属性指定该持久化类的对象的辨别值   如果不写默认为全限定类名

           <id  name="id" column="ID">                       

                   <generator  class="native">                           //指定主键生成器策略

          </id>

          <discriminator  column="FLAG"  type="string"  />     //  映射辨别列

          ....                                                              //省略 name属性 sex属性与对应数据列的映射关系

          <subclass  name="org.lingtong.pojo.Teacher"  discriminator-value="老师” />             //discriminator-value属性指定该持久化类的对象的辨别值   如果不写默认为全限定类名            

                  .........                                                //省略 className属性   subject属性与对应数据列的映射关系 

                                                                           //可以继续嵌套子类    但是永远保存在一张表中   

          </subclass>

</class>

2.采用<joined-subclass>元素的继承映射

采用这种策略  ,父类实例的属性保存在父类表中 ,而子类实例的属性则由父类表和子类表共同存储。将父类和子类共有的属性(即子类通过继承而来的属性)保存在父类表中 ,子类自己扩张增加的属性,则保存在子类表中 。

使用这种映射策略,无需使用辨别者列。但是需要为每个子类表使用<key>元素指定一列去关联父类表的主键列 。<key>元素对应的列 即充当主键又充当外键。

这种关系可以看成“纵向分割映射”

father 类              son类                   grandson类      

id                        id                         id                                        

name                  name                    name                                          //则 三个共有属性  形成父类表

sex                      sex                      sex

--------------------------------------------------------------

                          position                 position                                        //则  两个 子类和孙子类的 共有属性  形成子类表

                          wife                       wife                                               //需要指定一列 去关联父类表的主键列     (该列既是主键又是外键)

---------------------------------------------------------------

                                                      age                                               //则   两个 由孙子类的 特有属性     形成孙子表

                                                      sport                                              //需要指定一列   去关联之类表的主键列       (该列既是主键又是外键)

---------------------------------------------------------------

映射文件配置  

<class  name="org.lingtong.pojo.Father" table="tb_person_info1"  >            //discriminator-value属性指定该持久化类的对象的辨别值   如果不写默认为全限定类名

           <id  name="id" column="ID">                       

                   <generator  class="native">                           //指定主键生成器策略

          </id>

          ....                                                              //省略 name属性 sex属性与对应数据列的映射关系

          <joined-subclass  name="org.lingtong.pojo.Son"    table="tb_person_info2" />                

                 <key  column="son_id">

                  .....                                                // 省略  position属性 与 wife属性与对应数据列的映射关系

                  <joined-subclass  name="org.lingtong.pojo.Son"    table="tb_person_info3" />  

                          <key  column="grandson_id">                            

                           ......                                    // 省略   age属性 与 sport属性与对应数据列的映射关系      

                  </joined-subclass>

          </joined-subclass>

</class>

通过这种映射方式形成的数据表  

   查询孙子类的实例对象对应的记录时   需要跨越三张表   

   查询子类的实例对象对应的记录时需要跨越两张表  

   查阅父类的对象实例对应的记录需要一张表 

3.采用<union-subclass>元素的继承映射

 "横向分割映射"

原文地址:https://www.cnblogs.com/wangliyue/p/4151864.html