【SSH進階之路】Hibernate映射——一對多關聯映射(七)

來源:互聯網
上載者:User

標籤:hibernate   orm   ssh   

      上上篇博文【SSH進階之路】Hibernate映射——一對一單向關聯映射(五),我們介紹了一對一的單向關聯映射,單向是指只能從人(Person)這端載入身份證端(IdCard),但是反過來,不能從身份證端載入人得資訊。

      上篇博文【SSH進階之路】Hibernate映射——一對一雙向關聯映射(六),雙向關聯映射解決了單向關聯映射只能從一端載入資訊的缺陷,當然,雙向關聯映射並不影響儲存,隻影響載入。下面我們開始今天的內容:

 

一對多關聯映射

 

映射原理

 

      一對多關聯映射和多對一關聯映射的映射原理是一致的,都是在多的一端加入一個外鍵,指向一的一端。關聯關係都是由多端維護,只是在寫映射時發生了變化。

 

多對一和一對多的區別

 

         多對一和一對多的區別在於維護的關係不同:

(1)多對一:多端維護一端的關係,在載入多端時,可以將一端載入上來。

(2)一對多:一端維護多端的關係,在載入一端時,可以將多端載入上來。

 

分類

 

一對多單向關聯映射

 

物件模型

         

      從物件模型中,我們可以看出,Group持有User的一個引用。由於是單向關聯,所以資料在載入Group時,會把User載入上來,但是User並不知道Group的存在。

 

      我們先看一下Group和User的實體,以及對應檔。

Group

package com.liang.hibernate;import java.util.Set;public class Group {private int id;private String name;private Set users;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set getUsers() {return users;}public void setUsers(Set users) {this.users = users;}}

User

package com.liang.hibernate;public class User {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

User.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.liang.hibernate.User" table="t_user"><id name="id"><generator class="native"/></id><property name="name"/></class></hibernate-mapping>

Group.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.liang.hibernate.Group" table="t_group"><id name="id"><generator class="native"/></id><property name="name"/><!-- users屬性,表達的是本對象與User的一對多的關係 --><set name="users"><key column="groupid"/><one-to-many class="com.liang.hibernate.User"/></set></class></hibernate-mapping>

產生的表結構和測試資料

缺點

 

1)因為多端User不知道Group的存在(也就是User不維護與Group的關係),所以在儲存User時,關係欄位groupId為null,如果該欄位設定為非空,則將無法儲存資料。

2)因為User不維護關係,而Group維護關係,Group就會發出多餘的update語句,保證Group和User有關係,這樣載入Group時才把該Users對應的使用者載入上來。

 

一對多雙向關聯映射

 

物件模型

          

        雙向關聯映射對比單向關聯映射,對象的載入方向由單向變成了雙向。

 

我們看一下Group和User的實體,對應檔

Group

package com.liang.hibernate;import java.util.Set;public class Group {private int id;private String name;private Set users;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set getUsers() {return users;}public void setUsers(Set users) {this.users = users;}}

User

package com.liang.hibernate;public class User {private int id;private String name;private Group groups;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Group getGroups() {return groups;}public void setGroups(Group groups) {this.groups = groups;}}

Group.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.liang.hibernate"><class name="Group" table="t_group"><id name="id"><generator class="native"/></id><property name="name"/><!-- 影響控制反轉:inverse="false",多的一端維護關係,讓一的一端失效 --><set name="users" inverse="true"><key column="groupid" not-null="true"/><one-to-many class="User"/></set></class></hibernate-mapping>

User.hbm.xml

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.liang.hibernate"><class name="User" table="t_user"><id name="id"><generator class="native"/></id><property name="name"/><!-- groups屬性,表達的是本對象與Group的多對一的關係 --><many-to-one name="groups" class="Group" column="groupid"/></class></hibernate-mapping>

產生的表和測試資料

 

一對多雙向關聯的映射方式:
 1)在一的一端的集合上採用<key>標籤,在多的一端加入一個外鍵
 2)在多的一端採用<many-to-one>標籤

注意:<key>標籤和<many-to-one>標籤加入的欄位保持一直,否則會產生資料混亂。

inverse屬性:

         inverse屬性可以用在一對多和多對多雙向關聯上,inverse屬性預設為false,為false表示本端維護關係,如果inverse為true,則本端不能維護關係,會交給另一端維護關係,本端失效。所以一對多關聯映射我們通常在多的一端維護關係,讓一的一端失效,所以設定為inverse為true。

注意:inverse屬性,隻影響資料的儲存,也就是持久化。

 

目的

 

       一對多雙向關聯映射的目的主要是為了解決一對多單向關聯的缺陷而不是需求驅動的。

 

總結

 

     一對多關聯映射還是很簡單的,下篇博文我們介紹多對多關聯映射。謝謝關注。

【SSH進階之路】Hibernate映射——一對多關聯映射(七)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.