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.其他