转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/hibernate/821.html
准备工作,新建两个实体类如下:
Husband.class:
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
32
33
34
|
package
com
.
himi
;
import
javax
.
persistence
.
Entity
;
import
javax
.
persistence
.
GeneratedValue
;
import
javax
.
persistence
.
Id
;
import
javax
.
persistence
.
OneToOne
;
@
Entity
public
class
Husband
{
@
Id
@
GeneratedValue
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
Wife
getWife
(
)
{
return
wife
;
}
public
void
setWife
(
Wife
wife
)
{
this
.
wife
=
wife
;
}
private
int
id
;
private
String
name
;
private
Wife
wife
;
}
|
wife.class:
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
|
package
com
.
himi
;
import
javax
.
persistence
.
Entity
;
import
javax
.
persistence
.
GeneratedValue
;
import
javax
.
persistence
.
Id
;
@
Entity
public
class
Wife
{
@
Id
@
GeneratedValue
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
;
}
private
int
id
;
private
String
name
;
}
|
生成数据库如下:
OK, 下面开始:
1. 一对一:
1.1 单向外键关联
使用注解 @OneToOne
当前Husband类中有一个wife对象,将其注解成OneToOne即可,那么观察生成的两张表如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
mysql
&
gt
;
desc
Husband
;
+
--
--
--
--
-
+
--
--
--
--
--
--
--
+
--
--
--
+
--
--
-
+
--
--
--
--
-
+
--
--
--
--
--
--
--
--
+
|
Field
|
Type
|
Null
|
Key
|
Default
|
Extra
|
+
--
--
--
--
-
+
--
--
--
--
--
--
--
+
--
--
--
+
--
--
-
+
--
--
--
--
-
+
--
--
--
--
--
--
--
--
+
|
id
|
int
(
11
)
|
NO
|
PRI
|
NULL
|
auto_increment
|
|
name
|
varchar
(
255
)
|
YES
|
|
NULL
|
|
|
wife_id
|
int
(
11
)
|
YES
|
MUL
|
NULL
|
|
+
--
--
--
--
-
+
--
--
--
--
--
--
--
+
--
--
--
+
--
--
-
+
--
--
--
--
-
+
--
--
--
--
--
--
--
--
+
3
rows
in
set
(
0.09
sec
)
mysql
&
gt
;
desc
Wife
;
+
--
--
--
-
+
--
--
--
--
--
--
--
+
--
--
--
+
--
--
-
+
--
--
--
--
-
+
--
--
--
--
--
--
--
--
+
|
Field
|
Type
|
Null
|
Key
|
Default
|
Extra
|
+
--
--
--
-
+
--
--
--
--
--
--
--
+
--
--
--
+
--
--
-
+
--
--
--
--
-
+
--
--
--
--
--
--
--
--
+
|
id
|
int
(
11
)
|
NO
|
PRI
|
NULL
|
auto_increment
|
|
name
|
varchar
(
255
)
|
YES
|
|
NULL
|
|
+
--
--
--
-
+
--
--
--
--
--
--
--
+
--
--
--
+
--
--
-
+
--
--
--
--
-
+
--
--
--
--
--
--
--
--
+
2
rows
in
set
(
0.00
sec
)
|
其中如果想更改注解 @OneToOne默认为我们生成的Wife_id名,可以使用@JoinColumn(name=”xxx”) 即可;
1.2. 双向外键关联 :
仍然使用注解 @OneToOne
但是如果是双向关联,必须设置其@OneToOne(mappedBy=”xxx”) xxx表示对方那里是主导属性名”
1.3 单向主键关联:
在@OneToOne 下继续使用注解:@PrimaryKeyJoinColumn 即可 ;
1.4 双向主键关联
在另外一个关联类中,@OneToOne 下也继续使用注解:@PrimaryKeyJoinColumn
2. 一对一联合主键映射:
类似其他映射,只是联合主键在自定义名字时,不能使用 @JoinColumn,而是使用如下形式:
1
2
3
4
5
6
7
|
@
JoinColumns
(
{
@
JoinColumn
(
name
=
"wifeId"
,
referencedColumnName
=
"id"
)
,
@
JoinColumn
(
name
=
"wifeName"
,
referencedColumnName
=
"name"
)
}
)
|
这里wifeId和wifeName是自定义主键名,referencedColumnName则对应其主键名;
3.(嵌入式对象)组件映射:
将另外一个类成为实体类的一部分进行映射;
注意:1.成为其他实体类一部门的类不要注解为@Entity 实体类!
2. 使用@Embedded 将其类注解即可;
3.组件属性名名为了保证不与实体类属性名冲突,可以使用如下注解:
3.1 使用如下形式:
1
2
3
4
5
6
7
|
@
AttributeOverrides
(
{
@
AttributeOverride
(
name
=
"xx"
,
column
=
@
Column
(
name
=
"xxx"
)
)
,
@
AttributeOverride
(
name
=
"xx2"
,
column
=
@
Column
(
name
=
"xxx2"
)
)
,
}
)
|
3.2 在嵌入式对象里,对其属性使用@column进行设置;
4.多对一单向关联
很容易,直接使用注解 @ManyToOne
5. 一对多单向关联
如果直接使用 @OneToMany 进行注解,默认Hibernate当成多对多进行映射,如果需要设置一对多,那么如下继续注解:
@JoinColumn(name=”GroupId”) 加入这个即可让默认多对多,当成一对多处理;
6.一对多、多对一双向关联
一对多,多对一双向关联属于一个映射;直接使用mappedBy即可( @OneToMany(mappedBy=”xxx”) );
7. 多对多单向关联
使用注解 @ManyToMany ,其中如果想自定义中间表的表名和类名可以使用 @JoinTable 关键字;
8.多对多双向关联
关联两个实体类 @ManyToMany即可;