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.集合映射
本文详细介绍了Hibernate关系映射中的关联映射、继承映射及其三种实现策略:单表继承、具体表继承和类表继承。同时,阐述了复合主键映射、组件映射、集合映射和其他相关内容。

1365

被折叠的 条评论
为什么被折叠?



