一對多關聯映射和多對一的關聯映射的映射原理是一致的,都是在多的一端加入一個外鍵,指向一的一端。關聯關係都是由多端維護,只是在寫映射時發生了變化。html
多對一和一對多的區別在於維護的關係不一樣:java
(1)多對一:多端維護一端的關係,在加載多端時,能夠將一端加載上來。app
(2)一對多:一端維護多端的關係,在加載一端時,能夠將多端加載上來。測試
對象模型this
從對象模型中,咱們能夠看出,Group持有User的一個引用。因爲是單向關聯,因此數據在加載Group時,會把User加載上來,可是User並不知道Group的存在。spa
咱們先看一下Group和User的實體,以及映射文件。.net
Grouphibernate
[java] view plain copyxml
Userhtm
[java] view plain copy
User.hbm.xml
[html] view plain copy
Group.hbm.xml
[html] view plain copy
生成的表結構和測試數據
1)由於多端User不知道Group的存在(也就是User不維護與Group的關係),因此在保存User時,關係字段groupId爲null,若是該字段設置爲非空,則將沒法保存數據。
2)由於User不維護關係,而Group維護關係,Group就會發出多餘的update語句,保證Group和User有關係,這樣加載Group時才把該Users對應的用戶加載上來。
對象模型
雙向關聯映射對比單向關聯映射,對象的加載方向由單向變成了雙向。
咱們看一下Group和User的實體,映射文件
Group
[java] view plain copy
User
[java] view plain copy
Group.hbm.xml
[html] view plain copy
User.hbm.xml
[html] view plain copy
生成的表和測試數據
一對多雙向關聯的映射方式:
1)在一的一端的集合上採用<key>標籤,在多的一端加入一個外鍵
2)在多的一端採用<many-to-one>標籤
注意:<key>標籤和<many-to-one>標籤加入的字段保持一直,不然會產生數據混亂。
inverse屬性:
inverse屬性能夠用在一對多和多對多雙向關聯上,inverse屬性默認爲false,爲false表示本端維護關係,若是inverse爲true,則本端不能維護關係,會交給另外一端維護關係,本端失效。因此一對多關聯映射咱們一般在多的一端維護關係,讓一的一端失效,因此設置爲inverse爲true。
注意:inverse屬性,隻影響數據的存儲,也就是持久化。
一對多雙向關聯映射的目的主要是爲了解決一對多單向關聯的缺陷而不是需求驅動的。
一對多關聯映射仍是很簡單的,下篇博文咱們介紹多對多關聯映射。謝謝關注。