一、映射类型
- 一对多(one-to-many)
- 多对一(many-to-one)
- 一对一(one-to-one)
- 多对多(many-to-many)
二、一对一关联
有两种策略可以实现一对一的关联映射
- 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
- 唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系;
1、一对一主键关联单向
两个对象之间是一对一的关系,如Person-IdCard
image.png原理:
让两个实体对象的id保持相同
生成的t_person表的主键id 作为t_idcard表的外键
( t_person表的主码id 取自t_idcard表的主码)
IdCard类
public class IdCard {
private int id;
private String cardNo;
关联映射
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
Person类
public class Person {
private int id;
private String name;
private IdCard idCard
关联映射
<class name="com.hibernate.Person" table="t_person">
<id name="id">
<!-- person的主键来自于关联对象idCard -->
<generator class="foreign" >
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<!-- one-to-one 标签的含义:hibernate根据主键加载关联对象idCard,
constrained=“true”表明当前主键上存在一个约束person的主键作为外键参照了idCard-->
<one-to-one name="idCard" constrained="true"/>
</class>
生成的SQL语句如下:
create table t_idcard (id integer not null auto_increment, cardNo varchar(255), primary key (id))
create table t_person (id integer not null, name varchar(255), primary key (id))
alter table t_person add index FK785BED802591D1EF (id), add constraint FK785BED802591D1EF foreign key (id) references t_idcard (id)
2、一对一主键关联双向
hibernate一对一主键关联映射(双向关联Person<---->IdCard)
- 需要在idcard映射文件中加入<one-to-one>标签指向person,指示hibernate如何加载person
- 默认根据主键加载
- 需要在idcard类中加入对Person类的引用
Person类
public class Person {
private int id;
private String name;
private IdCard idCard;
. . . . . .
关联映射
<class name="com.bjsxt.hibernate.Person" table="t_person">
<id name="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="idCard" constrained="true"/>
</class>
IdCard类
public class IdCard {
private int id;
private String cardNo;
private Person person;
. . . .
关联映射
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person"/>
</class>
3、一对一唯一外键关联单向
image.pnghibernate一对一唯一外键关联映射(单向关联Person---->IdCard)
一对唯一外键关联映射是多对一关联映射的特例
可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
通过这种手段映射一对一唯一外键关联
Person类
public class Person {
private int id;
private String name;
private IdCard idCard
关联映射
<class name="com.bjsxt.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true"/>
</class>
IdCard类
public class IdCard {
private int id;
private String cardNo;
关联映射
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
4、一对一唯一外键关联双向
image.png说明:
hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)
一对一唯一外键关联双向,需要在另一端idcard类中加入对Person的引用
一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载其关联对象,默认根据主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,所以不能指定主键(id)加载person(默认),而要根据person的外键(idCard)加载,所以采用如下映射方式:<one-to-one name="person" property-ref="idCard"/>
Person类
public class Person {
private int id;
private String name;
private IdCard idCard;
. . . . . .
映射文件
<class name="com.bjsxt.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true"/>
</class>
IdCard类
public class IdCard {
private int id;
private String cardNo;
private Person person;
. . . . . .
映射文件
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person" property-ref="idCard"/>
</class>
网友评论