一对一 :
![](https://img-blog.csdn.net/20130711120752281)
1.唯一外键关联
Person 类:
public
class
Person {
private
Integer
id
;
private
String
name
;
private
PersonInfo
personInfo
;
...
映射文件:
<
class
name
=
"Person"
>
<
id
name
=
"id"
>
<
generator
class
=
"native"
></
generator
>
</
id
>
<
property
name
=
"name"
></
property
>
<
many-to-one
name
=
"personInfo"
class
=
"PersonInfo"
column
=
"personInfoId"
unique
=
"true"
></
many-to-one
>
</
class
>
PersonInfo 类:
public
class
PersonInfo {
private
Integer
id
;
private
String
info
;
...
映射文件:
<
class
name
=
"PersonInfo"
>
<
id
name
=
"id"
>
<
generator
class
=
"native"
></
generator
>
</
id
>
<
property
name
=
"info"
></
property
>
</
class
>
表结构:
person 表
personInfo 表
结论:
从表结构看:
person 表中有一个外键指向 personInfo 中某条数据,即实现了一对一
从面相对象看:
在Person 类中有 有一个 personInfo 属性(不是集合)及表明了一个 Person对象对应一个personInfo 对象
2.联合组建关联:
类文件不变;
映射文件:
<
class
name
=
"Person"
>
<
id
name
=
"id"
>
<!--
因为主键不是自己生成的,而是作为一个外键(来源于其它值),所以使用foreign生成策略
foreign:使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。
再使用元素 <param>的属性值指定相关联对象(这里Person相关联的对象为PersonInfo,
则标识符为PersonInfo的id)为了能够在加载person数据同时加载PersonInfo数据,
所以需要使用一个标签<one-to-one>来设置这个功能。
-->
<
generator
class
=
"foreign"
>
<!-- 元素<param>属性name的值是固定为property -->
<
param
name
=
"property"
>
personInfo
</
param
>
</
generator
>
</
id
>
<
property
name
=
"name"
></
property
>
<!-- <one-to-one>标签
表示如何加载它的引用对象(这里引用对象就指idCard这里的name值是idCard),同时也说是一对一的关系。
默认方式是根据主键加载(把person中的主键取出再到IdCard中来取相关IdCard数据。)
我们也说过此主键也作为一个外键引用 了IdCard,所以需要加一个数据库限制(外键约束)constrained="true"
-->
<
one-to-one
name
=
"personInfo"
constrained
=
"true"
></
one-to-one
>
</
class
>
.........
没有变化;
<
class
name
=
"PersonInfo"
>
<
id
name
=
"id"
>
<
generator
class
=
"native"
></
generator
>
</
id
>
<
property
name
=
"info"
></
property
>
</
class
>
表结构:
person 表:
personInfo 表
person 表中的主键 可以看成是指向personInfo的外键。 及和personInfo 共享之间
但是在 有一点在存储 person 是 personInfo 必须有存在。
在person 的映射文件中 :
<
one-to-one
name
=
"personInfo"
constrained
=
"true"
></
one-to-one
> 中
constrained
属性为true表示 外键约束 表示该表的主键关联生成