(1)一对一关联映射含义:
既两个对象之间的一对一关系,以及如何加载它的引用对象如:Person(人) <--对应-->IdCard(身份证号)
(2)实现一对一关联的两种策略
1)主键关联:既让两个对象拥有相同的主键值,既表明他们是一一对应的关系;
数据库不会有额外的字段来维护他们之间的关系,仅通过表的主键关联。
2)唯一外键关联:外键关联,本来用来配置多对一的关系映射,但是如果加上唯一的限
制后,也可以用来实现一对一关联映射。
(3)实体类ER图
Person IdCard
------------- -------------
id:int id:int
name:String carNo:String
IdCard:idCard(引用)
实体类在数据库中表的表现形式:
t_person t_idCard
------------- -------------
id | name id | carNO
1 | alpha 1 | 88888
说明1:因为要查询到某个人和这个人的身份证号,所以人的实体类需要持有身份证类的引用;反之如果先拿到身份证号,需要找到身份证号对应的某个人,那么就需要咋身份证类中持有人的实体类的引用。
说明2:单向一对一就是从人的实体类可以找到某个人对应身份证号类中的号码,反之不行。
假如规定只能从人的实体类中找到该人在身份证号实体类中对应的身份证号码则:
[color=red]此时Person类中的id就有两个角色,既是Person类的主键和IdCard类的外键[/color]
双向一对一就是从任何一个类都可以找到另一类中一一对应的信息。
主键关联的讲解:
(1)通过t_person和t_idCard两张表中id实现相同逐渐关联
(2)因为Person类中含有对IdCard类的引用,所以必须先有身份证号,后有人的信息
(3)重点:此时Person类的id不是自己生成而是参照IdCard类的id生成(通过配置文件实现)
(4)实现:通过配置文件将对象关系转换成类--表的关系映射
Person.hbm.xml文件的核心配置
<class name="com.tarena.pojo.Person" table="t_person">
<id name="id">
<generator class="foreign"><!--注意此处主键生成策略是foreign-->
<param name="perpoty">idCard(此处为Person类中IdCard的引用)</param>
</generator>
</id>
<one-to-one name="idCard" constrained="true"/>
<!--此标签name的属性也是IdCard的引用,使约束属性为true,目的说明Person的id也是IdCard的外键约束-->
</class>
(5)测试代码
IdCard idCard = new IdCard();(插入操作)
idCard.setCardNO("88888888");//默认了cascade级联属性所以它是第一个存
Person person = new Person;
person.setName("张三");
persion.setIdCard(idCard);//将身份证类的实例赋值给Person的引用
session.save(person);//将Person实例存入数据库
Person person =(Person)session.load(Person.Class,1);(查询操作,传id)
System.out.println("person.name"+person.getName());
System.out.println("person.cardNO"+person.getIdCard().getCardNO;
既两个对象之间的一对一关系,以及如何加载它的引用对象如:Person(人) <--对应-->IdCard(身份证号)
(2)实现一对一关联的两种策略
1)主键关联:既让两个对象拥有相同的主键值,既表明他们是一一对应的关系;
数据库不会有额外的字段来维护他们之间的关系,仅通过表的主键关联。
2)唯一外键关联:外键关联,本来用来配置多对一的关系映射,但是如果加上唯一的限
制后,也可以用来实现一对一关联映射。
(3)实体类ER图
Person IdCard
------------- -------------
id:int id:int
name:String carNo:String
IdCard:idCard(引用)
实体类在数据库中表的表现形式:
t_person t_idCard
------------- -------------
id | name id | carNO
1 | alpha 1 | 88888
说明1:因为要查询到某个人和这个人的身份证号,所以人的实体类需要持有身份证类的引用;反之如果先拿到身份证号,需要找到身份证号对应的某个人,那么就需要咋身份证类中持有人的实体类的引用。
说明2:单向一对一就是从人的实体类可以找到某个人对应身份证号类中的号码,反之不行。
假如规定只能从人的实体类中找到该人在身份证号实体类中对应的身份证号码则:
[color=red]此时Person类中的id就有两个角色,既是Person类的主键和IdCard类的外键[/color]
双向一对一就是从任何一个类都可以找到另一类中一一对应的信息。
主键关联的讲解:
(1)通过t_person和t_idCard两张表中id实现相同逐渐关联
(2)因为Person类中含有对IdCard类的引用,所以必须先有身份证号,后有人的信息
(3)重点:此时Person类的id不是自己生成而是参照IdCard类的id生成(通过配置文件实现)
(4)实现:通过配置文件将对象关系转换成类--表的关系映射
Person.hbm.xml文件的核心配置
<class name="com.tarena.pojo.Person" table="t_person">
<id name="id">
<generator class="foreign"><!--注意此处主键生成策略是foreign-->
<param name="perpoty">idCard(此处为Person类中IdCard的引用)</param>
</generator>
</id>
<one-to-one name="idCard" constrained="true"/>
<!--此标签name的属性也是IdCard的引用,使约束属性为true,目的说明Person的id也是IdCard的外键约束-->
</class>
(5)测试代码
IdCard idCard = new IdCard();(插入操作)
idCard.setCardNO("88888888");//默认了cascade级联属性所以它是第一个存
Person person = new Person;
person.setName("张三");
persion.setIdCard(idCard);//将身份证类的实例赋值给Person的引用
session.save(person);//将Person实例存入数据库
Person person =(Person)session.load(Person.Class,1);(查询操作,传id)
System.out.println("person.name"+person.getName());
System.out.println("person.cardNO"+person.getIdCard().getCardNO;