前語:
在Nhibernate xml 的檔案配置上,一對一和多對多的配置比較簡單,容易出錯的反而是一對多(多對一)上。
1、一對一關聯關系的映射:
序号
屬性
含義和作用
必須
預設值
1
映射類屬性的名字
Y
2
映射的目标類。也就是與這個屬性相關聯的是哪個類
N
3
操作時的級聯關系 。這個屬性的可選值有:
all--所有的操作均進行級聯操作。
none--所有操作均不進行級聯操作
save-update--在執行 save 和 update 時進行級聯操作
delete--在執行delete時進行級聯操作
4
表明目前類對應的表與被關聯的表之間是否存在着外鍵限制。這将影響級聯操作的順序
false
5
設定抓取資料的政策。這個屬性的可選值有:
join--外連接配接抓取
select--序列選擇抓取
6
指定關聯類的屬性名,這個屬性将會和本類的主鍵相對應
關鍵類的主鍵
7
Hibernate 通路這個屬性的政策
property
8
絕大多數一對一的關聯都指向其實體的主鍵。在一些少見的情況中,可能會指向其他的
一個或多個字段,或者是一個表達式,在這些情況下,可以用一個sql公式來表示
9
指定對于此關聯對象是否使用延遲加載的政策。這個屬性的可選值有:
proxy--通過代理進行關聯
true--此關聯對象采用延遲加載,在該執行個體變量第一次被通路時抓取(需要運作時
位元組翃的增強)
false--此關聯對象不采用延遲加載。注意,如果constrained="false",則不能
使用代理,hibernate會采取預先抓取
proxy
10
被關聯類的實體名
例如,A和B之間是一對一的關系,那麼反過來B和A之間的關系也是一對一的。需要在這兩個實體的映射檔案中都進行
相應的配置。這樣,才能完整地表示這兩個對象之間的關系。
例如,對于Employee和Person進行主鍵一對一關聯。首先需要在Employee對象的配置檔案中定義到Person對象的關聯:
然後還需要在Person對象的配置檔案中定義到Employee對象的關聯:
另外,為了確定兩個對象的主鍵值是相等的,在定義主鍵的時候可以使用名稱為 foreign 的Hibernate 辨別符生成政策來實作這一目的。
Person對象主鍵字段的映射資訊的配置方法如下所示:
2、一對多(雙向)關聯關系的映射:
class
關聯的目标類
not-found
指名若關聯的對象不存在,該如何處理
Exception
entity-name
被關聯的類的實體名,作為class的替代
在通常情況下,要将一對多的關聯關系配置為雙向,這樣可以友善地從任意一方進行資料的維護工作,同時也可以解決上面所提到的問題。
2、多對一(雙向)關聯關系的映射:
通常情況下,關聯關系的主要方設定為“多”的這一方,這樣就可避免需要在“多”的一方的關聯字段中先插入空值的情況出現。
多對一的關聯關系需要在“多”的這一方使用<many-to-one>來進行配置,配置的方法如下:
另外,為了使“多”的這一方變為主要方,還需要在配置“一”的一方增加“inverse=true”的配置(set的屬性)。
在對象之間的關聯關系中,“inverse='false'” 的一方變為主要方,由它來負責維護對象之間的關聯關系。
3、多對多關聯關系的映射:
中間關聯表中映射到關聯目标表的關聯字段
select
指名若關聯的對象不存在,該如何處理。這個屬性的可能取值有:
exception--産生一個異常
ignore--對于不存在的應用将關聯到Null
exception
絕大多數的關聯的關聯都指向其實體的主鍵。在一些少見的情況中,可能會指向其它的一個或多個字段,或者是一個
表達式,這些情況下,可以用一個sql公式來表示
在開發中經常遇到的使用者(User)和角色(Role)的關系就是多對多的關系。一個使用者可以擁有多個角色,同時一個角色又可以被很多的
使用者所擁有。那麼在描述這兩個對象之間的關系時就需要建立一個中間表User_Role來确立它們之間的關系。
首先,需要在其中一個對象(例如,User)中配置一個多對多的關聯,如下所示:
同樣,在另一個對象(例如,Role)中需要進行如下配置:
在這裡還是要再次提醒大家,對象之間的關聯關系是雙方向的,在配置的時候通常需要進行雙向配置