心得10-hibernate 高级映射之继承映射

1.对象模型(Java类结构)

2.一个类继承体系一张表(subclass)(表结构)


一个类继承体系一张表(subclass)(映射文件)

<class name="Employee" table="employee" discriminator-value="0">

      <id name="id">

        <generator class="native"/>

      </id>

<!—鉴别器,用来标识雇员具体是哪个类型;需要注意的是鉴别器的位置是固定,不能乱放,只能放置在id后其他属性前-->

      <discriminator column="type" type="int"/>

      <property name="name"/>

      <subclass name="Skiller" discriminator-value="1">

        <property name=”skill”/>

      </subclass>

      <subclass name="Sales" discriminator-value="2">

        <property name="sell"/>

      </subclass>

</class>

3.  每个子类一张表(joined-subclass) (表结构)

 


每个子类一张表(joined-subclass) (映射文件)

<class name="Employee" table="employee">

      <id name="id">

        <generator class="native"/>

      </id>

      <property name="name"/>

<joined-subclass name="Skiller" table="skiller">

        <key column="employee_id"/>

        <property name="skill"/>

</joined-subclass>

<joined-subclass name="Sales" table="sales">

   <key column="employee_id"/>

   <property name="sell"/>

</joined-subclass>

</class>

4.混合使用“一个类继承体系一张表”和“每个子类一张表” (表结构)


混合使用“一个类继承体系一张表”和“每个子类一张表” (映射文件)

<class name="Employee" table="employee">

      <id name="id">

        <generator class="native"/>

      </id>

      <discriminator column="type"/>

      <property name="name"/>

      <subclass name="Skiller">

        <property name="net"/>

      </subclass>

      <subclass name=”Sales”>

        <join table="sales">

           <key column="employee_id"/>

           <property name="sell"/>

        </join>

      </subclass>

</class>

5.每个具体类一张表(union-subclass) (表结构)

每个具体类一张表(union-subclass) (映射文件)

<class name="Employee" abstract="true">

      <id name="id">

        <generator class="hilo"/>

      </id>

      <property name="name"/>

      <union-subclass name="Skiller" table="skiller">

        <property name="skill"/>

      </union-subclass>

      <union-subclass name="Sales" table="sales">

        <property name="sell"/>

      </union-subclass>     

   </class>

主健不能是identity类型,如果父类是abstract=”true”就不会有表与之对应。

隐式多态,映射文件没有联系,限制比较多很少使用。

 


6.  以上情况的优缺点

继承关系:

1).整个继承关系一张表:子类的属性比较少的情况。要使用多态查询时。优点:只有一张表,查找快,查询效率高些;运用多态理念,符合java核心技术。缺点:如果增加子类表结构会被修改,操作麻烦;如果子类特别多,不同子类的不同字段也特别多,那么这张表里会出现很多空值null。

2).每个子类一张表:子类的属性较多时优点:数据库中不存在无用的字段,即不存在空值。

3).每个具体类一张表:当父类是抽象类。不需要多态查询时。缺点:查找的时候先合并所有表然后在查找,比较慢,效率低。

 

 

posted @ 2012-12-25 17:54  yangkai_keven  阅读(150)  评论(0编辑  收藏  举报