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

来源:互联网 发布:朝日啤酒 知乎 编辑:程序博客网 时间:2024/05/21 20:43
【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_.IDwhere manager0_.ID=?

  - 使用property-ref属性的sql
from MANAGERS manager0_left outer join DEPARTMENTS department1_on manage0_.ID=department1_.MANAGER_IDwhere 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-onename="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,否则两端都维护关联关系可能会造成主键冲突。
0 0