歡迎來到小米的博客
希望能和您交流Java編程的知識和見解
BlogJava
首頁
新隨筆
聯(lián)系
聚合
管理
隨筆-57 評論-202 文章-17 trackbacks-0
Hibernate的一對一關聯(lián)實例
Hibernate中的表的關聯(lián)有一對一,一對多和多對多三種關聯(lián)方式,在這篇筆記和接下來的筆記中,我將用我自己的實際例子來說明如何具體實施。
我使用的Hibernate版本是2.1.8,在Hibernate的網(wǎng)站2.1.6版本的中文文檔中有關一對一的關聯(lián)有下面一段表述:
5.1.11. 一對一
持久化對象之間一對一的關聯(lián)關系是通過one-to-one元素定義的。
<
one-to-one
name
="propertyName"
(1)
class
="ClassName"
(2)
cascade
="all|none|save-update|delete"
(3)
constrained
="true|false"
(4)
outer-join
="true|false|auto"
(5)
property-ref
="propertyNameFromAssociatedClass"
(6)
access
="field|property|ClassName"
(7)
/>
(1) name: 屬性的名字。
(2) class (可選 - 默認是通過反射得到的屬性類型):被關聯(lián)的類的名字。
(3) cascade(級聯(lián)) (可選) 表明操作是否從父對象級聯(lián)到被關聯(lián)的對象。
(4) constrained(約束) (可選) 表明該類對應的表對應的數(shù)據(jù)庫表,和被關聯(lián)的對象所對應的數(shù)據(jù)庫表之間,通過一個外鍵引用對主鍵進行約束。這個選項影響save()和delete()在級聯(lián)執(zhí)行時的先后順序(也在schema export tool中被使用)。
(5) outer-join(外連接) (可選 - 默認為 自動): 當設置hibernate.use_outer_join的時候,對這個關聯(lián)允許外連接抓取。
(6) property-ref: (可選) 指定關聯(lián)類的一個屬性,這個屬性將會和本外鍵相對應。如果沒有指定,會使用對方關聯(lián)類的主鍵。
(7) access (可選 - 默認是 property): Hibernate用來訪問屬性的策略。
有兩種不同的一對一關聯(lián):
主鍵關聯(lián)
惟一外鍵關聯(lián)
主鍵關聯(lián)不需要額外的表字段;兩行是通過這種一對一關系相關聯(lián)的,那么這兩行就共享同樣的主關鍵字值。所以如果你希望兩個對象通過主鍵一對一關聯(lián),你必須確認它們被賦予同樣的標識值!
比如說,對下面的Employee和Person進行主鍵一對一關聯(lián):
<
one-to-one
name
="person"
class
="Person"
/>
<
one-to-one
name
="employee"
class
="Employee"
constrained
="true"
/>
現(xiàn)在我們必須確保PERSON和EMPLOYEE中相關的字段是相等的。我們使用一個特別的稱為foreign的Hibernate標識符生成器策略:
<
class
name
="person"
table
="PERSON"
>
<
id
name
="id"
column
="PERSON_ID"
>
<
generator
class
="foreign"
>
<
param
name
="property"
>
employee
</
param
>
</
generator
>
</
id
>
<
one-to-one
name
="employee"
class
="Employee"
constrained
="true"
/>
</
class
>
一個剛剛保存的Person實例被賦予和該Person的employee屬性所指向的Employee實例同樣的關鍵字值。
另一種方式是一個外鍵和一個惟一關鍵字對應,上面的Employee和Person的例子,如果使這種關聯(lián)方式,應該表達成:
<
many-to-one
name
="person"
class
="Person"
column
="PERSON_ID"
unique
="true"
/>
如果在Person的映射加入下面幾句,這種關聯(lián)就是雙向的:
<
one-to-one
name"employee" class
="Employee"
property-ref
="person"
/>
下面是我的一個一對一主鍵關聯(lián)的例子,使用的數(shù)據(jù)庫是MySQL 4.1.11:
我有兩個表:UserBasic和UserInfo,UserBasic記錄的是用戶的基本注冊信息,UserInfo表記錄的是用戶的詳細信息。表的結(jié)構(gòu)如下:
1
CREATE
TABLE
IF
NOT
EXISTS
UserBasic
2
(
3
Guid
INT
NOT
NULL
AUTO_INCREMENT,
4
Account
VARCHAR
(
64
)
NOT
NULL
,
5
Password
VARCHAR
(
16
)
NOT
NULL
,
6
Email
VARCHAR
(
128
)
NOT
NULL
,
7
PRIMARY
KEY
(Guid)
8
) TYPE
=
InnoDB;
9
10
CREATE
TABLE
IF
NOT
EXISTS
UserInfo
11
(
12
Guid
INT
NOT
NULL
,
13
Username
VARCHAR
(
128
),
14
Gender
CHAR
(
1
),
15
Birthday
DATETIME
,
16
PRIMARY
KEY
(Guid)
17
) TYPE
=
InnoDB;
18
19
ALTER
TABLE
UserInfo
ADD
CONSTRAINT
UserInfoRFUserBasic
FOREIGN
KEY
(Guid)
20
REFERENCES
UserBasic (Guid)
ON
DELETE
CASCADE
ON
UPDATE
RESTRICT
;
UserInfo的主鍵值和UserBasic的主鍵值是一樣的,兩個表是單向的一對一關系。UserBasic為主控方,UserInfo是被動方。
用Middlegen生成的UserBasic.hbm.xml文件,修改后的內(nèi)容如下:
1
<?
xml version="1.0"
?>
2
<!
DOCTYPE hibernate-mapping PUBLIC
3
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
4
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
5
6
<
hibernate-mapping
>
7
<!--
8
Created by the Middlegen Hibernate plugin 2.1
9
10
http://boss.bekk.no/boss/middlegen/
11
http://www.hibernate.org/
12
-->
13
14
<
class
15
name
="com.xxx.hibernate.UserBasic"
16
table
="UserBasic"
17
dynamic-update
="true"
18
dynamic-insert
="true"
19
>
20
<
meta
attribute
="class-description"
inherit
="false"
>
21
@hibernate.class
22
table="UserBasic"
23
dynamic-update="true"
24
dynamic-insert="true"
25
</
meta
>
26
27
<
id
28
name
="guid"
29
type
="int"
30
column
="Guid"
31
>
32
<
meta
attribute
="field-description"
>
33
@hibernate.id
34
generator-class="native"
35
type="int"
36
column="Guid"
37
38
39
</
meta
>
40
<
generator
class
="native"
/>
41
</
id
>
42
43
<
property
44
name
="account"
45
type
="java.lang.String"
46
column
="Account"
47
not-null
="true"
48
length
="64"
49
>
50
<
meta
attribute
="field-description"
>
51
@hibernate.property
52
column="Account"
53
length="64"
54
not-null="true"
55
</
meta
>
56
</
property
>
57
<
property
58
name
="password"
59
type
="java.lang.String"
60
column
="Password"
61
not-null
="true"
62
length
="16"
63
>
64
<
meta
attribute
="field-description"
>
65
@hibernate.property
66
column="Password"
67
length="16"
68
not-null="true"
69
</
meta
>
70
</
property
>
71
<
property
72
name
="email"
73
type
="java.lang.String"
74
column
="Email"
75
not-null
="true"
76
length
="128"
77
>
78
<
meta
attribute
="field-description"
>
79
@hibernate.property
80
column="Email"
81
length="128"
82
not-null="true"
83
</
meta
>
84
</
property
>
85
86
<!--
Associations
-->
87
88
<!--
bi-directional one-to-one association to UserInfo
-->
89
<
one-to-one
90
name
="userInfo"
91
class
="com.xxx.hibernate.UserInfo"
92
cascade
="save-update"
93
>
94
<
meta
attribute
="field-description"
>
95
@hibernate.one-to-one
96 class="com.xxx.hibernate.UserInfo"
97
cascade="save-update"
98
</
meta
>
99
</
one-to-one
>
100
101
</
class
>
102
</
hibernate-mapping
>
由于在建立外鍵的時候就聲明了ON DELETE CASCADE,所以在xml的配置文件中第97行聲明為save-update。如果聲明為all,那么在刪除UserBasic表的數(shù)據(jù)時,會無謂的多出一條刪除UserInfo的delete語句出來。
UserInfo.hbm.xml文件的內(nèi)容如下:
1
<?
xml version
=
"
1.0
"
?>
2
<!
DOCTYPE hibernate
-
mapping PUBLIC
3
"
-//Hibernate/Hibernate Mapping DTD 2.0//EN
"
4
"
http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd
"
>
5
6
<
hibernate
-
mapping
>
7
<!--
8
Created by the Middlegen Hibernate plugin
2.1
9
10
http:
//
boss.bekk.no/boss/middlegen/
11
http:
//
www.hibernate.org/
12
-->
13
14
<
class
15
name
=
"
com.xxx.hibernate.UserInfo
"
16
table
=
"
UserInfo
"
17
dynamic
-
update
=
"
true
"
18
dynamic
-
insert
=
"
true
"
19
>
20
<
meta attribute
=
"
class-description
"
inherit
=
"
false
"
>
21
@hibernate.
class
22
table
=
"
UserInfo
"
23
dynamic
-
update
=
"
true
"
24
dynamic
-
insert
=
"
true
"
25
</
meta
>
26
27
<
id
28
name
=
"
guid
"
29
type
=
"
int
"
30
column
=
"
Guid
"
31
>
32
<
meta attribute
=
"
field-description
"
>
33
@hibernate.id
34
generator
-
class
=
"
foreign
"
35
type
=
"
int
"
36
column
=
"
Guid
"
37
38
39
</
meta
>
40
<
generator
class
=
"
foreign
"
>
41
<
param name
=
"
property
"
>
userBasic
</
param
>
42
</
generator
>
43
</
id
>
44
45
<
property
46
name
=
"
username
"
47
type
=
"
java.lang.String
"
48
column
=
"
Username
"
49
length
=
"
128
"
50
>
51
<
meta attribute
=
"
field-description
"
>
52
@hibernate.property
53
column
=
"
Username
"
54
length
=
"
128
"
55
</
meta
>
56
</
property
>
57
<
property
58
name
=
"
gender
"
59
type
=
"
java.lang.String
"
60
column
=
"
Gender
"
61
length
=
"
1
"
62
>
63
<
meta attribute
=
"
field-description
"
>
64
@hibernate.property
65
column
=
"
Gender
"
66
length
=
"
1
"
67
</
meta
>
68
</
property
>
69
<
property
70
name
=
"
birthday
"
71
type
=
"
java.sql.Date
"
72
column
=
"
Birthday
"
73
length
=
"
19
"
74
>
75
<
meta attribute
=
"
field-description
"
>
76
@hibernate.property
77
column
=
"
Birthday
"
78
length
=
"
19
"
79
</
meta
>
80
</
property
>
81
82
<!--
Associations
-->
83
84
<!--
bi
-
directional one
-
to
-
one association to UserBasic
-->
85
<
one
-
to
-
one
86
name
=
"
userBasic
"
87
class
=
"
com.xxx.hibernate.UserBasic
"
88
constrained
=
"
true
"
89
>
90
<
meta attribute
=
"
field-description
"
>
91
@hibernate.one
-
to
-
one
92
class
=
"
com.xxx.hibernate.UserBasic
"
93
constrained
=
"
true
"
94
</
meta
>
95
</
one
-
to
-
one
>
96
97
</
class
>
98
</
hibernate
-
mapping
>
用hbm2java生成對應的對應的Java類:hbm2java *.xml --output=xxx。
Hibernate的配置文件hibernate.cfg.xml內(nèi)容如下:
1
<?
xml version="1.0" encoding="utf-8"
?>
2
<!
DOCTYPE hibernate-configuration
3
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
4
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"
>
5
6
<
hibernate-configuration
>
7
<
session-factory
>
8
9
<!--
local connection properties
-->
10
<
property
name
="hibernate.connection.url"
>
jdbc:mysql://127.0.0.1/xxx?useUnicode=true
&
characterEncoding=UTF-8
&
autoReconnect=true
</
property
>
11
<
property
name
="hibernate.connection.driver_class"
>
com.mysql.jdbc.Driver
</
property
>
12
<
property
name
="hibernate.connection.username"
>
root
</
property
>
13
<
property
name
="hibernate.connection.password"
>
123456
</
property
>
14
<!--
property name="hibernate.connection.pool_size"></property
-->
15
16
<!--
dialect for MySQL
-->
17
<
property
name
="dialect"
>
net.sf.hibernate.dialect.MySQLDialect
</
property
>
18
19
<
property
name
="hibernate.show_sql"
>
true
</
property
>
20
<
property
name
="hibernate.use_outer_join"
>
true
</
property
>
21
<
property
name
="hibernate.transaction.factory_class"
>
net.sf.hibernate.transaction.JDBCTransactionFactory
</
property
>
22
23
<
mapping
resource
="com/xxx/hibernate/UserBasic.hbm.xml"
/>
24
<
mapping
resource
="com/xxx/hibernate/UserInfo.hbm.xml"
/>
25
26
</
session-factory
>
27
</
hibernate-configuration
>
JUnit的測試用例程序片斷如下:
1
public
void
testInsertUser() throws Exception
{
2
UserBasic user
=
new
UserBasic();
3
user.setAccount(
"
test
"
);
4
user.setPassword(
"
123456
"
);
5
user.setEmail(
"
georgehill@21cn.com
"
);
6
7
UserInfo info
=
new
UserInfo();
8
info.setUsername(
"
George Hill
"
);
9
info.setGender(
"
M
"
);
10
info.setBirthday(
new
Date());
11
12
user.setUserInfo(info);
13
info.setUserBasic(user);
14
15
Transaction tx
=
session.beginTransaction();
16
session.save(user);
17
tx.commit();
18
}
運行測試程序,可以看到輸出了兩條insert語句。
posted on 2005-05-14 15:02
小米
閱讀(4047)
評論(2)
編輯
收藏
所屬分類:
Hibernate
評論:
#
re: Hibernate的一對一關聯(lián)實例 2014-10-16 16:03 |
vds
好樣的
回復
更多評論
#
re: Hibernate的一對一關聯(lián)實例
2016-06-17 15:32 |
33
根據(jù)寫了報錯了是怎么回事
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
《深入淺出Hibernate》讀書筆記(9)——Session管理
《深入淺出Hibernate》讀書筆記(8)——Hibernate分頁
《深入淺出Hibernate》讀書筆記(7)——回調(diào)與攔截機制
《深入淺出Hibernate》讀書筆記(6)——集合類型和結(jié)果集排序
《深入淺出Hibernate》讀書筆記(5)——持久層操作
《深入淺出Hibernate》讀書筆記(4)——事務管理
《深入淺出Hibernate》讀書筆記(3)——數(shù)據(jù)緩存
《深入淺出Hibernate》讀書筆記(2)——實體對象識別
《深入淺出Hibernate》讀書筆記(1)——實體對象生命周期
用HQL獲取部分的實體對象屬性
小米,生活在深圳,專注于Java,主要從事數(shù)據(jù)庫和網(wǎng)頁編程。現(xiàn)在在學習著Hibernate和Spring。喜歡游戲、音樂和臺球。聯(lián)系方式:georgehill@21cn.com
<
2005年5月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(27)
給我留言
查看公開留言
查看私人留言
隨筆分類
Hibernate(15)
Java(17)
Spring(1)
Struts(5)
其它(5)
數(shù)據(jù)庫(2)
生活隨筆(12)
隨筆檔案
2006年4月 (1)
2006年3月 (1)
2005年8月 (1)
2005年7月 (11)
2005年6月 (13)
2005年5月 (30)
文章分類
Eclipse(1)
Java(8)
其它(8)
文章檔案
2005年7月 (1)
2005年6月 (13)
2005年5月 (3)
我的朋友們
emu的博客
Java BY
我的鏈接
Java Research
SUN Java技術中文社區(qū)
拯救程序員王俊
搜索
積分與排名
積分 - 233179
排名 - 247
最新評論
1.?re: Hibernate的一對一關聯(lián)實例
根據(jù)寫了報錯了是怎么回事
--33
2.?re: 用java.util.Timer定時執(zhí)行任務
評論內(nèi)容較長,點擊標題查看
--yunp
3.?re: Hibernate的一對一關聯(lián)實例
好樣的
--vds
4.?re: 如何在Struts中實現(xiàn)分頁顯示數(shù)據(jù)(1)
PageData中的集合是所有都取出,還是用多少取多少,若是前者,會拖慢系統(tǒng)的。
--李亞男
5.?re: BMP文件格式
評論內(nèi)容較長,點擊標題查看
--見面
閱讀排行榜
1.?用java.util.Timer定時執(zhí)行任務(33743)
2.?用JFreeChart畫柱狀圖的范例(10691)
3.?《深入淺出Hibernate》讀書筆記(3)——數(shù)據(jù)緩存(6108)
4.?《深入淺出Hibernate》讀書筆記(8)——Hibernate分頁(5555)
5.?用ChartDirector在JSP中畫統(tǒng)計圖(5246)
評論排行榜
1.?如何在Struts中實現(xiàn)分頁顯示數(shù)據(jù)(2)(25)
2.?獻出一份愛心 共同援助重病程序員王俊(22)
3.?Struts的國際化完整解決方案(11)
4.?2005年6月27日,一個值得紀念的日子(9)
5.?《深入淺出Hibernate》讀書筆記(1)——實體對象生命周期(9)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 小米
主站蜘蛛池模板:
成人区精品一区二区不卡亚洲
|
中文字幕亚洲一区二区三区
|
人成午夜免费视频在线观看
|
久久国产色AV免费看
|
久99久精品免费视频热77
|
baoyu116.永久免费视频
|
国产在线精品一区免费香蕉
|
免费看一区二区三区四区
|
a毛片全部播放免费视频完整18
|
国产在线观看无码免费视频
|
中文日本免费高清
|
一个人看的www免费视频在线观看
|
日韩a级无码免费视频
|
久久精品电影免费动漫
|
五月婷婷在线免费观看
|
毛片高清视频在线看免费观看
|
岛国大片免费在线观看
|
国产一区二区三区免费看
|
亚洲精品A在线观看
|
亚洲精品国产美女久久久
|
亚洲精品国产字幕久久不卡
|
亚洲伊人tv综合网色
|
亚洲中文字幕久久精品无码2021
|
亚洲日本一线产区和二线产区对比
|
亚洲AV无码片一区二区三区
|
曰批免费视频播放免费
|
免费观看一区二区三区
|
曰批全过程免费视频播放网站
|
亚洲人成网站在线观看播放动漫
|
美女视频黄免费亚洲
|
女bbbbxxxx另类亚洲
|
波霸在线精品视频免费观看
|
免费A级毛片av无码
|
成年女人免费视频播放体验区
|
亚洲成A人片在线观看无码3D
|
亚洲国产成人一区二区三区
|
亚洲欧洲日产国码在线观看
|
色噜噜噜噜亚洲第一
|
国产永久免费高清在线
|
99久久免费精品国产72精品九九
|
亚洲国产成人乱码精品女人久久久不卡
|