【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】
*域模型(一个部门只能有一个经理,一个经理只能在一个部门)
*关系数据模型:
- 按照外键映射
- 按照主键映射
【基于外间映射的1-1】
*对于基于外间的1-1关联,其外间可以存放在任意一边,在需要存放外间一端,增加many-to-one元素。为many-to-one元素增加unique="true"属性来表示为1-1关联
*另一端需要使用one-to-one元素,钙元素使用property-ref属性指定使用被关联实体逐渐以外的字段作为关联字段
- 不适用property-ref属性的sql
- 使用property-ref属性的sql
【基于主键映射的1-1】
*基于主键的映射策略:指一端的主键生成器使用foreign策略,表明根据"对方"的主键来生成自己的主键,自己并不能独立生成主键。<param>子元素指定当前持久化类的那个属性作为"对方"
*采用foreign主键生成器策略的一端增加one-to-one元素映射关联属性,其one-to-one属性还应增加constrained="true"属性;另一端增加one-to-one元素映射关联属性。
*constrained(约束):指定当前持久化对应的数据库表的主键添加一个外键约束,引用被关联的对象("对方")所对应的数据库表主键
【单向n-n】
*域模型:
*关系数据模型
*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
【双向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,否则两端都维护关联关系可能会造成主键冲突。
*在对象-关系映射文件中,用于映射持久化类之间关联关系的元素,<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,否则两端都维护关联关系可能会造成主键冲突。