Hibernate關聯關系配置(一對一,一對多以及多對多)


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屬性值一致


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM