概念
基本映射是對一個實體進行映射,關聯映射就是處理多個實體之間的關系,將關聯關系映射到數據庫中,所謂的關聯關系在對象模型中有一個或多個引用。
分類
關聯關系分為上述七種,但是由于相互之間有各種關系,可以簡化,例如:多對一與一對多映射,只是側重的角度不對而已。
映射技巧
映射技巧是小編寫映射文件的過程,總結的經典內容,總共分為四步,咋看不是特別易懂,但是效果很好。下面我們以實例看技巧。
(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類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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的關聯映射中最簡單的一種映射關系
總結
以上所述是小編給大家介紹的hibernate多對一單項關聯,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://blog.sina.com.cn/s/blog_9c6852670102wvih.html