hihernate一對多關聯映射(單向Classes----->Student)
一對多關聯映射利用了多對一關聯映射原理
多對一關聯映射:在多的一端加入一個外鍵指向一的一端,它維護的關系是多指向一
一對多關聯映射:在多的一端加入一個外鍵指向一的一端,它維護的關系是一指向多
也就是說一對多和多對一的映射策略是一樣的,只是站的角度不同
在一一端維護關系的缺點:
* 如果將t_student表里的classesid字段設置為非空,則無法保存
* 因為不是在student這一端維護關系,所以student不知道是哪個班的,
所以需要發出多余的update語句來更新關系
hihernate一對多關聯映射(雙向Classes<----->Student)
一對多雙向關聯映射:
* 在一一端的集合上使用<key>,在對方表中加入一個外鍵指向一一端
* 在多一端采用<many-to-one>
注意:<key>標簽指定的外鍵字段必須和<many-to-one>指定的外鍵字段一致,否則引用字段的錯誤
如果在”一“一端維護一對多關聯關系,hibernate會發出多余的udpate語句,所以我們一般在多
的一端來維護關聯關系
關於inverse屬性:
inverse主要用在一對多和多對多雙向關聯上,inverse可以被設置到集合標簽<set>上,
默認inverse為false,所以我們可以從”一“一端和”多“一端維護關聯關系,
如果設置成inverse為true,則我們只能從多一端來維護關聯關系
注意:inverse屬性,只影響數據的存儲,也就是持久化
inverse和cascade
* inverse是關聯關系的控制方向
* cascade操作上的連鎖反應
hibernate一對一主鍵關聯映射(單向關聯Person---->IdCard)
一對一主鍵關聯映射:讓兩個實體對象的id保持相同,這樣可以避免多余的字段被創建
具體映射:
<id name="id">
<!-- person的主鍵來源idCard,也就是共享idCard的主鍵 -->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<!-- one-to-one標簽的含義,指示hibernate怎么加載它的關聯對象,默認根據主鍵加載,
constrained="true", 表明當前主鍵上存在一個約束,person的主鍵作為外鍵參照了idCard
-->
<one-to-one name="idCard" constrained="true"/>
hibernate一對一主鍵關聯映射(雙向關聯Person<---->IdCard)
需要在idcard映射文件中加入<one-to-one>標簽指向person,指示hibernate如何加載person
默認根據主鍵加載
hibernate一對一唯一外鍵關聯映射(單向關聯Person---->IdCard)
一對唯一外鍵關聯映射是多對一關聯映射的特例
可以采用<many-to-one>標簽,指定多的一端的unique=true,這樣就限制了多的一端的多重性為一
通過這種手段映射一對一唯一外鍵關聯
hibernate一對一唯一外鍵關聯映射(雙向關聯Person<---->IdCard)
一對一唯一外鍵關聯雙向,需要在另一端(idcard),添加<one-to-one>標簽,指示hibernate如何加載
其關聯對象,默認根據主鍵加載person,外鍵關聯映射中,因為兩個實體采用的是person的外鍵維護的關系,
所以不能指定主鍵加載person,而要根據person的外鍵加載,所以采用如下映射方式:
<one-to-one name="person" property-ref="idCard"/>
hibernate多對一關聯映射
關聯映射的本質:
* 將關聯關系映射到數據庫,所謂的關聯關系是對象模型在內存中的一個或多個引用
<many-to-one>會在多的一端加入一個外鍵,指向一的一端,這個外鍵是由<many-to-one>
中的column屬性定義的,如果忽略了這個屬性那么默認的外鍵與實體的屬性一致
<many-to-one>標簽的定義示例:
* <many-to-one name="group" column="groupid"/>
理解級聯的含義?
* 是對象的連鎖操作
hibernate多對多關聯映射(單向User---->Role)
具體映射方式:
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
</set>
hibernate多對多關聯映射(雙向User<---->Role)
映射方法:
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
</set>
table屬性值必須和單向關聯中的table屬性值一致
<key>中column屬性值要與單向關聯中的<many-to-many>標簽中的column屬性值一致
在<many-to-many>中的column屬性值要與單向關聯中<key>標簽的column屬性值一致