Hibernate学习笔记 第三章 高级映射关系

本文深入解析了对象-关系映射中的关键概念cascade属性及其多种值的含义,同时介绍了不同类型的关联映射策略,包括一对一、一对多及多对多关联的具体实现方式。
【cascade属性】
*在对象-关系映射文件中,用于映射持久化类之间关联关系的元素,<set>,<many-to-one>和<one-to-many>都有一个cascade属性,它用于指定如何操纵与当前对象关联的其他对象。
cascade属性值
none             :当Session操纵当前对象时,忽略其他关联的对象。它是cascade属性的默认值
save-update      :当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象
persist          :当通过Session的persist()方法来保存当前对象时,会级联保存所有关联的新建的临时对象
merge            :当通过Session的merge()方法来保存当前对象时,会级联融合所有关联的游离对象
delete           :当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象
lock             :当通过Session的lock()方法把当前游离对象加入到Session缓存中时,会把所有关联的游离对象也加入到Session缓存中。
replicate        :当通过Session的replicate()方法赋值当前对象时,会级联复制所有级联的对象
evict            :当通过Session的evict()方法从Session缓存中清楚当前对象时,会级联清除所有关联的对象
refresh          :当通过Session的refresh()放阿福刷新当前对象时,会级联刷新所有关联的对象。所谓级联刷新是指读取数据库中相应数据,然后根据数据库中的最新数据去同步更新Session缓存中的相应对象
all              :包含save-update、persist、merge、delete、lock、reflicate、evict及refresh的行为
delete-orphan    :删除所有和当前对象解除关联关系的对象
all-delete-orphan:包含all和delete-orphan的行为
【1-1】
*域模型(一个部门只能有一个经理,一个经理只能在一个部门)
 |---------------|              |---------------|
 |  Department   |              |    Manager    |
 |---------------|              |---------------|
 |id:Integer     |--------------|id:Integer     |
 |name:String    |              |name:String    |
 |manager:Manager|              |age:Integer    |
 |---------------|              |dept:Department|
                                |---------------|

*关系数据模型:
  - 按照外键映射
  - 按照主键映射
【基于外间映射的1-1】
*对于基于外间的1-1关联,其外间可以存放在任意一边,在需要存放外间一端,增加many-to-one元素。为many-to-one元素增加unique="true"属性来表示为1-1关联
<many-to-one name="manager" class="Manager" column="MANAGER_ID"
	cascade="all" unique="true">

*另一端需要使用one-to-one元素,钙元素使用property-ref属性指定使用被关联实体逐渐以外的字段作为关联字段
<one-to-one name="dept" class="Department" property-ref="manager">

  - 不适用property-ref属性的sql
from MANAGER manager0_
left outer join DEPARTMENTS department1_
on manager0_.ID=department1_.ID
where manager0_.ID=?

  - 使用property-ref属性的sql
from MANAGERS manager0_
left outer join DEPARTMENTS department1_
on manage0_.ID=department1_.MANAGER_ID
where manager0_.ID=?

【基于主键映射的1-1】
*基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键。<param>子元素指定当前持久化类的那个属性作为"对方"
<id name="id" column="ID" tyoe="Integer">
	<generator class="foreigne">
		<param name="property">manager</param>
	</generator>
</id>

*采用foreign主键生成器策略的一端增加one-to-one元素映射关联属性,其one-to-one属性还应增加constrained="true"属性;另一端增加one-to-one元素映射关联属性。
*constrained(约束):指定当前持久化对应的数据库表的主键添加一个外键约束,引用被关联的对象("对方")所对应的数据库表主键
<one-to-one
	name="manager"
	class="Manager"
	constrained="true"/>

【单向n-n】
*域模型:
 |-------------|              |-------------|
 |  Category   |              |   item      |
 |-------------|              |-------------|
 |id:Integer   |--------------|id:Integer   |
 |name:String  |0..n      0..n|name:String  |
 |item:Set     |              |price:Integer|
 |-------------|              |-------------|

*关系数据模型
*n-n的关联必须使用连接表
*与1-n映射类似,必须为set几何元素添加key子元素,指定CATEGORIES_ITEMS表中参照CATEGORIES表的外建伟CATEGORY_ID.与1-n关联映射不同的是,建立n-n关联时,集合中的元素使用many-to-many.many-to-many子元素的class属性指定items集合中存放的是Item对象,column属性指定CATEGORIES_ITEMS表中参照ITEMS表的外键为ITEM_ID
<set name="items" table="CATEGORIES_ITEMS" cascade="save-update">
	<key column="CATEGORY_ID"></key>
	<many-to-many class="Item" column="ITEM_ID"/>
</set>

【双向n-n】
*双向n-n关联需要两端都是用集合属性
*双向n-n关联必须使用连接表
*集合属性应增加key子元素用以映射外键列,集合元素里还应增加many-to-many子元素关联实体类
*在双向n-n关联的两边都需指定连接表的表名及外键列的列名。两个几何元素set和table元素的值必须指定,而且必须相同。set元素的两个子元素:key和many-to-many分别制定本持久化类和关联类在连接表中的外键列名,因此两边的key与many-to-many的column属性较差相同。也就是说,一边的set元素的key的column值为a.many-to-many的column为b;则另一边的set元素的key的column值b.many-to-many的column值为a.
*对于双向n-n关联,必须把其中一端的inverse设置为true,否则两端都维护关联关系可能会造成主键冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值