Hibernate学习5:一对一关联映射
文章目录
概述
一对一关联映射指的是两个对象之间是一对一的关系,比如person—id_card。
一对一关联映射可以分为两种:
- 主键关联:两个对象具有相同的主键值,以表明他们之间的一一对应的关系,数据库表不会有额外的字段去维护他们之间的关系,仅通过表的主键来关联。
- 外键关联:本来是用于一对多的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系。
主键关联
举例来说明主键关联,数据库中有一张person表,用来存放人员信息,包括姓名和年龄,还有一张id_card表,存放身份证信息。E-R图
- person对象是主对象,id_card对象是从对象
- id_card表的主键是person表的主键
对象模型
1
2
3
4
5
6
7public class Person {
private int id;
private String name;
private IdCard idCard;
//省去get、set方法
}
1 | public class IdCard { |
映射文件
Person.hbm.xml
1 | <?xml version="1.0"?> |
IdCard.hbm.xml
1 | <?xml version="1.0"?> |
- 如果采用基于主键的映射策略,则一端的主键生成器需要使用foreign策略,表明将根据对方的主键来生成自己的主键,本实体不能拥有自己的主键声称策略。
- 子元素指定使用当前持久化类的哪个属性作为“对方”。
- 任意一端都可以采用foreign主键生成器策略,表明将根据对方主键来生成自己的主键。
- 采用foreign主键生成器策略的一端增加one-to-one元素映射相关属性,其ont-to-one属性还应增加constrained=true属性;另一端增加one-to-one元素映射关联属性。
- constrained:指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联对象所对应的数据库主键。
测试方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23public void add() {
Session s = null;
Transaction tx = null;
try {
s = HibernateUtil.getSession();
IdCard idCard = new IdCard();
idCard.setUsefulLife(new Date());
Person p = new Person();
p.setName("p1");
p.setIdCard(idCard);
idCard.setPerson(p);
tx = s.beginTransaction();
s.save(p);
s.save(idCard);
tx.commit();
} finally {
if (s != null)
s.close();
}
}
外键关联
举例来说明主键关联,数据库中有一张person表,用来存放人员信息,包括姓名和年龄,还有一张id_card表,存放身份证信息。
E-R图
- person对象是主对象,id_card对象是从对象
- id_card表的外键是person表的主键
- 基于外键的one-to-one,可以理解成多对一,但要加上unique=”true”约束,请注意下文中的映射文件!
对象模型
1
2
3
4
5
6
7public class Person {
private int id;
private String name;
private IdCard idCard;
//省去get、set方法
}
1 | public class IdCard { |
映射文件
Person.hbm.xml
1 | <?xml version="1.0"?> |
要使用
元素,该 元素需要使用name属性指定关联属性名。为了让系统不再为本表增加一列,而是使用外键关联,使用property-ref属性指定引用关联类的属性。 IdCard.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<?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="cn.zju.domain">
<class name="IdCard" table="id_card">
<id name="id">
<generator class="native" /> <!--更换成自增长的ID-->
</id>
<property name="usefulLife" column="useful_life"/>
<many-to-one name="person" column="person_id" unique="true"/>
</class>
</hibernate-mapping>基于外键的1-1关联,外键可以存放在任意一边。需要存放外键的一端,需要增加
元素,并且为 元素增加unique=”true”属性来表示该实体实际上是1的一端。 - 对于1-1的关联关系,两个实体原本处于平等状态,但当我们选择任意一个表来增加外键后(增加
元素的实体端),该表即变成从表,而另一个表则成为主表。