1. 程式人生 > >【hibernate】多對一,一對多關係

【hibernate】多對一,一對多關係

多對一對映:在說一對一外來鍵單向對映中,在“主”端維護的時候用的是 標籤,裡面新增的unique=”true” 屬性來約束的。這裡不新增unique屬性的時候就變成多對一的對映關係了。
“主”端: 多的一端

<hibernate-mapping>  
<class name="Student" table="t_student">  
  <id name="id">  
  <generator  class="native">  
 </id>  
 <property name="name"/>  
 <many-to-one name="classes" column="id_classes"  cascade="all" />// column 資料中的別名 cascade 表示級聯關係 通常用在多對一 ,和多對多的對映中  
</class>  
</hibernate-mapping>  

資料庫表中有三個欄位 id、name、id_class
“被”端: 一的一端

<hibernate-mapping>  
<class name="Classes" table="t_calsses">  
 <id name="id">  
  <generator class="native">  
  </id>  
<property name="name"/>  
</class>  
</hibernate-mapping>  

一對多單向對映:多對一的對映關係是在多的一端進行維護的,一對多關係對映則由一端來維護這種關係。
“主”端:一的一端來維護這種關係 ,用set標籤 在student的表中新增欄位 class_id 來進行關聯。

<hibernate-mapping>  
 <class name="Classes">  
    <id name="name">  
        <generator class="native">  
   </id>  
    <set name="students">  
    <key column="class_id"/> //class_id是這裡應該寫多的一端的外來鍵欄位,一定要與這個外來鍵欄位一致。在一的一端是沒有這個欄位的 
    <one-to-many class="Student"/>  
   </set>  
</class>  
</hibernate-mapping>  

“被”端:

<hibernate-mapping>  
 <class name="Student" table="t_student">  
 <id name="id">  
 <generator class="native">  
 </id>  
  <property name="name">  
  //我認為應該在這裡寫上class_id欄位吧?
 </class>  
 </hibernate-mapping>  

一對多關聯對映利用了多對一關聯對映原理:
多對一關聯對映:在多的一端加入外來鍵指向一的一端,他維護的關係是多指向一
一對多關聯對映: 在多的一端加入外來鍵指向一的一端,它維護的關係是一指向多
也就是說一對多和多對一的對映策略是一樣的,只是站的角度不同。
在一的一端維護的關係的缺點: 如果經t_student 表裡面的classes_id 欄位設為非空,則無法儲存。

一對多雙向關聯對映: 一對多雙向就是在一對多單向的基礎上,改變“被”端的.hbm.xml配置檔案。
一端基本上不變只是通常要 在標籤裡面要新增屬性 inverse=”true” 屬性,這個屬性是控制由哪端來維護關係的。如下:

<hibernate-mapping package="com.fony.hibernate">  
    <class name="Classes" table="t_classes">  
        <id name="id">  
            <generator class="native"/>  
        </id>  
        <property name="name"/>  
        <set name="students" inverse="true" cascade="all">// inverse 為關聯關係控制方向 設定為true只能從多端來維護關聯關係,預設為false  
            <key column="classesid"/>  
            <one-to-many class="Student"/>  
        </set>  
    </class>  
</hibernate-mapping>  

多端:

<hiberante-mapping>  
<class name="Student" table="t_student">  
 <id name="id">  
   <generator class="native">  
 </id>  
    <property name="name"/>  
  <many-to-one name="classes" column="classesid"/>  
</class>  
</hibernate-mapping>  

t_student 表有三個欄位: id 、name、classesid
一對多雙向總結如下:
在一的一端的集合上使用<key>,在對方表中加入一個外來鍵指向一的一端。
在多的一端要採用<many-to-one>標籤
<key>標籤指定的外來鍵欄位必須和<many-to-one>指定的外來鍵欄位一致,否則會引起欄位的錯誤。
在“一”一端維護一對多的關聯關係,hibernate會發多餘的update語句,所有我們一般在多的一端來維護這種關係,因此通常在set 標籤上新增inverse=“true” 屬性來提高系統效率。