Hibernate关系映射之继承映射

本文详细介绍了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
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值