在學習
hibernate
的時候,很大一部分任務量是配置實體對映關係,
hibernate
的對映關係的關鍵就是掌握物件導向的思想,搞清楚實體之間的關係。每乙個實體關係都對應這
uml中的物件關係。我們配置這些物件的關係模型。下面分節講述
hibernate
的關係對映。
本節主要講述
hibernate
的一和多的關係。之所以稱之為一和多的關係,是因為他包括三種關係:單向一對多,單向多對一,雙向一對多。我這裡統稱為它一對多。一對多關係是非常重要的關係,也是現實世界中最多的關係。這三個關係對應的是
uml中的關聯關係,也可以分成聚合和組合。
之所以把一對多分成三種型別,是因為它們站的角度不同。這裡就拿學生和班級的關係舉例,站在學生的角度看這個關係是多對一,站在班級的角度看是一對多。但是為了更好的使用這個關係,也考慮到實際操作的原因。一般把它們設定成雙向一對多。
單向多對一是站在多的角度去看關係的,在本例中就是站在學生的角度去看。首先看這個關係的
uml圖。
多個學生對應乙個班級。這裡的關係就是多對一的關係,站在學生的角度看。如果我們只是需要知道學生位於那個班級。這樣就只是單向的關係,也就是拿到
student,hi
bernate
會自動的給你抓取到對應的
classes
。單向的多對一是由需求產生的。是人為的設定的。這樣的關係中,
studnet
一端負責維護關係。它的對映原理是在
studnet
表的一段加入外來鍵,指向一的一端。
下面看這兩個實體對應的配置檔案
studen
t.hbm.xml
和classes.hbm.xml
<?xmlversion ="1.0"?>
關係在多的一端維護,就在多的一端配置。
<?xmlversion ="1.0"?>同單向多一對的關係類似,單向一對多關係是同乙個實體模型對映的不同關係模型。它是站在班級的角度去看問題的。也就是一的這一端去維護關係。也就是在載入一的時候,
hibernate
會自動載入上多的一端資料。他的對映原理和單向一對多是一樣的,都是在多的一端加入乙個外來鍵,指向一的一端。它的
uml圖如下,注意箭頭的指向不同了。
對應的配置檔案
studen
t.hbm.xml
和classes.hbm.xml
如下:
<?xmlversion ="1.0"?>
一的一端維護關係
<?xmlversion ="1.0"?>上面的兩種關係都是單向的,但是在實際應用中,我們往往需要雙向的載入。比如我拿到學生想知道他所在的班級,拿到班級想知道班裡面有的學生。這樣就需要雙向的關係。還有乙個很重要的原因就是,單向一對多關係在維護關係的過程中存在很大的缺陷。在插入學生的時候,如果班級不能為空,則學生是插入不了的。還有如果插入成功,在開始解決班級欄位是空的,在事務提交階段,班級需要更新每乙個學生的班級
id,這樣會產生大量的
update
語句。影響效率。所以一對多關係大多使用雙向一對多對映。
雙向一對多對映的
uml圖是這樣的。
它是乙個雙向的關聯(這裡僅限於對
hibernate
使用,和現實關係有不一致的地方)
雙向一對多的配置檔案
studen
t.hbm.xml
和classes.hbm.xml
如下:
<?xmlversion ="1.0"?>
<?xmlversion ="1.0"?>它的對映原理是
也就是兩端都要配置,和上面的兩種有所不同。但是需要注意的是
通過many-to-one元素,可以定義一種常見的與另乙個持久化類的關聯。這種關係模型是多對一關聯(實際上是乙個物件引用-譯註):這個表的乙個外來鍵引用目標表的主鍵字段。
一對多關聯,定義乙個表的外來鍵到另乙個表的主鍵,另乙個是多的一端。
inverse的值有兩種,「true」和「false」。inverse="false"是預設的值,如果設定為true則表示物件的狀態變化不會同步到資料庫 ;設定成false則相反;
inverse的作用:在hibernate中是通過inverse的設定來決定是有誰來維護表和表之間的關係的。
1:hibernate
中的實體類和我們以前做的實體類不太一樣,主要是以前的實體類如果包含其它表的字段,直接加上乙個
string
或者int
型別的資料就行。而
hibernate
中需要加入的是乙個實體類屬性字段。但是兩者生成的表是一樣的。就像上面
uml圖體現的那樣,第乙個是
studnet
實體類中有乙個
classes
型別的字段,第二個是
classes
中有乙個
student
型別的集合。第三個是他們雙方都有對方的乙個引用。 2
:一對多關係是比較常用的關係,很多時候都會對映出雙向的一對多。 3
:學習h
ibernate
要認真體會裡面的實體關係,由此去推出對映關係。這裡面用到了很多
uml的知識。需要重點研究。
Hibernate一對多和多對一關係詳解
雙向一對多關係,一是關係維護端 owner side 多是關係被維護端 inverse side 在關係被維護端需要通過 joincolumn建立外來鍵列指向關係維護端的主鍵列。public classorderimplementsserializable public classorderitem...
Hibernate一對多 雙向
hibernate 雙向關聯就是有 一對多 和 多對一 兩個關聯組合而成德,在雙向關聯的兩端都知道對方是誰。下面就開始演示這種關聯。首先定義我們需要使用的pojo物件。public class member public class order 兩個pojo對應的對映檔案分別為member.hbm....
Hibernate一對多對映
一對多使用區縣和街道舉例 街道的實體 private integer jdid 街道的id private string jdname 街道名 private quxian quxian 屬於哪個區縣 區縣的實體 private integer qxid 區縣的id private string q...