【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的關聯對映中最簡單的一種對映關係。下篇博文,我們介紹一對一單向關聯對映,謝謝關注。