1. 程式人生 > >【SSH進階之路】Hibernate對映——多對一單向關聯對映(四)

【SSH進階之路】Hibernate對映——多對一單向關聯對映(四)

【SSH進階之路】Hibernate基本原理(一) ,小編介紹了Hibernate的基本原理以及它的核心,採用物件化的思維操作關係型資料庫。

【SSH進階之路】Hibernate搭建開發環境+簡單例項(二),小編搭建了基本Hibernate的開發環境,並做了一個簡單例項,對它的基本原理有了一個理性的認識。

【SSH進階之路】Hibernate基本對映(三),我們介紹了Hibernate的基本對映(即對一個實體進行對映)的相關概念,並給大家實現相關例項,比較簡單。

       這篇部落格,我們開始介紹基於基本對映的關聯關係對映。

概念

       基本對映是對一個實體進行對映,關聯對映就是處理多個實體之間的關係,將關聯關係對映到資料庫中,所謂的關聯關係在物件模型中有一個或多個引用。


分類


        

        關聯關係分為上述七種,但是由於相互之間有各種關係,可以簡化,例如:多對一與一對多對映,只是側重的角度不對而已。

對映技巧

       對映技巧是小編寫對映檔案的過程,總結的經典內容,總共分為四步,咋看不是特別易懂,但是效果很好。下面我們以例項看技巧。

(1)寫註釋

         格式為:?屬性,表達的是本物件與?的?關係。

         解釋:在寫對映檔案之前先寫註釋,將問號的地方填上相應的內容。例如:<!-- group屬性,表達的是本物件(User)與Group的多對一的關係-->

(2)寫對映的框架(拷模版)

多對一

<many-to-one name=“” class=“” column=“”/>

一對多

Set

<set name="">

        <key column=""></key>

        <one-to-many class=""/>

</set>

多對多

Set

<set name="" table="">

        <key column=""></key>

        <many-to-many class="" column=""/>

</set>

(3)填空

          填空,就是將對映的框架資訊,填寫完成,完成對映檔案。

          • name屬性:屬性名(註釋中的第1問號)
          • class屬性:關聯的實體型別(註釋中的第2個問號)
          • column屬性:
               ○ <many-to-one column="..">:一般可以寫成屬性名加Id字尾,如屬性為group,則column值寫成groupId。
               ○ 一對多中的<key column="..">:從關聯的對方(對方是多對一)對映中把column值拷貝過來。
               ○ 多對多中的<key column=“..”>:一般可以寫成本物件的名加Id字尾,如本物件名為User,則寫為userId。
               ○ 多對多中的<many-to-many column=“..”>:一般可以寫為關聯物件的名稱加Id字尾。

(4)完成

          將對映檔案新增到hibernate.hbm.xml中,這個相信大家都知道為什麼。

          我們後面所有關聯對映的博文都使用此對映技巧來寫對映檔案,明白之後,速度會非常快。

多對一關聯對映

對映原理

       多的一端維護關聯關係,在“多”的一端加入一個外來鍵,指向“一”的一端。多的一端持有一的一端的引用,即在“多”的一端加外來鍵,指向“一”的一端。

例項

       比如,多個使用者屬於同一組,我們從物件模型和關係模型兩個角度來分析一下這個例子,如下:

      從上圖可以看出,物件模型具有方向性,通過使用者(User)可以看到組(Group),但是不能反過來。使用者和組各對應一張資料庫表,聚合關係需要一個外來鍵(groupid)來表示,最後生成的表如下所示:

作用:

      當我拿到使用者時直接就可以拿到使用者的組,hibernate在訪問多的一端時,可以自動的載入關聯物件。對於使用者(User)來說,它的關聯物件是組(group)。

      上面都是多對一關聯對映的基本原理,以及相應的例項,下面我們看一下程式碼:

 程式碼

User類

public class User {
	private int id;
	private String name;
	private Group group;
		
	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 getGroup() {
		return group;
	}
	public void setGroup(Group group) {
		this.group = group;
	}
}

Group類

public class Group {
	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 package="com.liang.hibernate">
	<class name="User" table="t_user">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
		<!-- group屬性,表達的是本物件與Group的多對一的關係-->
		<many-to-one name="group" class="Group" column="groupid"></many-to-one>
		<!-- 解釋:
			多對一關係標籤:
			<many-to-one name=“” class=“” column=“”/>
			
			1、第1個問號:group是User類的屬性,對應於name屬性名
			2、第2個問號:class表達的是本物件(User)與Group的關係
			3、第3個問號:column是屬性名+Id
			當我們寫完註釋之後,我們直接拷貝問號的對應關係即可。
		 -->
	</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"></generator>
		</id>
		<property name="name"></property>
	</class>
</hibernate-mapping>

生成的表結構,與上面的分析的關係模型一樣:
         

      專案中,多對一關聯對映是最常見的對映,但它Hibernate的關聯對映中最簡單的一種對映關係。下篇博文,我們介紹一對一單向關聯對映,謝謝關注。