天天看點

Nhibernate 一對一,一對多,多對多 成功映射

前語:

在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)中需要進行如下配置:

在這裡還是要再次提醒大家,對象之間的關聯關系是雙方向的,在配置的時候通常需要進行雙向配置