读书人

Hibernate关系投射之继承映射

发布时间: 2013-01-02 13:08:44 作者: rapoo

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
速度飞快~

读书人网 >软件架构设计

热点推荐