【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” 屬性來提高系統效率。