首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate关系投射之继承映射

2013-01-02 
Hibernate关系映射之继承映射Hibernate关系映射1.关联映射2.继承映射继承实现的三种策略单表继承。每棵类继

Hibernate关系映射之继承映射
Hibernate关系映射1.关联映射2.继承映射

  继承实现的三种策略

         单表继承。每棵类继承树使用一个表(table per class hierarchy)

         具体表继承。每个子类一个表(tableper subclass)

         类表继承。每个具体类一个表(tableper concrete class)(有一些限制)

(1)每棵类继承树一张表

        缺点:冗余

         优点:效率,不管查什么,都一张表

         数据库设计一般是粗粒度的,特别是数量大的时候;当然数量特别大,都放一张表里,也不行

 

         因为类继承树肯定是对应多个类,要把多个类的信息存放在一张表中,

         必须有某种机制来区分哪些记录是属于哪个类的.这种机制就是,在表中添加一个字段,

         用这个字段的值来进行区分.用hibernate实现这种策略的时候,有如下步骤:

         (1)父类用普通的<class>标签定义

         (2)在父类中定义一个discriminator,即指定这个区分的字段的名称和类型

         如:<discriminatorcolumn="" type="string" />

         (3)子类使用<subclass>标签定义,在定义subclass的时候,需要注意如下几点:

         subclass标签的name属性是子类的全路径名

         在subclass标签中,用discriminator-value属性来标明本子类的discriminator字段

         的值(来区分不同类的字段)

         (4)subclass标签,既可以被class标签所包含(这种包含关系正是表明了类之间的继承关系),

         也可以与class标签平行(需要在subclass标签中添加extends属性,里面的值是父类的全路径名称).

         子类的其他属性,像普通类一样,定义在subclass标签的内部.

 

         关于鉴别值,在存储的时候,hibernate会自动存储,在加载的时候,会根据鉴别值取得相关的对象

 

<hibernate-mapping package="com.ys.hibernate"><class name="Animal" table="t_animal" lazy="false"><id name="id">   <generator class="native" /> </id><discriminator column="type" type="string" /><property name="name" /><property name="sex" /><subclass name="Pig" discriminator-value="P">    <property name="weight" /></subclass><subclass name="Bird" discriminator-value="B">    <property name="height" /></subclass></class></hibernate-mapping>
(2)每个类一张表

        优点:层次清楚. t_pig表里只放Pig的扩展属性,bird也是

         缺点:当数量非常大的时候,关联的表太多,效率不好;类的继承层次越深,关联的表越多

<hibernate-mapping package="com.ys.hibernate"><class name="Animal" table="t_animal" ><id name="id">   <generator class="native" /> </id><property name="name" /><property name="sex" /><joined-subclass name="Pig" table="t_pig">    <key column="pid" />    <property name="weight" /></joined-subclass><joined-subclass name="Bird" table="t_bird">    <key column="bid" />    <property name="height" /></joined-subclass></class></hibernate-mapping>
(3)每个具体类一张表

缺点:不能使用id自增(如native)

<hibernate-mapping package="com.ys.hibernate"><class name="Animal" table="t_animal" abstract="true"><id name="id">   <generator class="assigned" /> </id><property name="name" /><property name="sex" /><union-subclass name="Pig" table="t_pig">    <property name="weight" /></union-subclass><union-subclass name="Bird" table="t_bird">    <property name="height" /></union-subclass></class></hibernate-mapping>
3.复合主键映射

4.组件映射

5.集合映射

6.其他
1楼lb858585852012-12-11 00:16
速度飞快~

热点排行