1 基于外键的单向一对一关系
基于外键的一对一,只需要将多对一种外键约束添加唯一即可。配置如下:
<class name="Person">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<property name="age"/>
<!--
unique="true"时候 可以设置一对一的关系
-->
<many-to-one name="idCard" class="IdCard" cascade="save-update"
column="idcard_id" foreign-key="fk_idcard" not-null="true"
unique="true"/>
</class>
2 基于外键关联的双向一对一关联
public class IdCard {
private int id;
private String code;
private Person person;
}
<class name="Person">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<property name="age"/>
<!--
unique="true" 时候可以设置一对一的关系-->
<many-to-one name="idCard" class="IdCard" cascade="save-update"
column="idcard_id" foreign-key="fk_idcard"
not-null="true" unique="true"/>
</class>
public class Person {
private int id;
private String name;
private int age;
private IdCard idcard;
}
<class name="IdCard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="code"/>
<!-- 映射到person中的idCard中,在Person中均互相关联,在Person配置文件中也有映射到IdCard中。 -->
<one-to-one name="person" property-ref="idCard"></one-to-one>
</class>
基于外键的双向关联,在两个实体映射中均存在指向对方主键的外键。
3 基于主键的单向一对一关联。
不需要外键,因为是基于主键的。两个实体对应的表结构中的主键一一映射。
public class Person {
private int id;
private String name;
private int age;
private IdCard idCard;
}
<class name="Person">
<id name="id">
<!-- foreign表示引用外键 -->
<generator class="foreign">
<!-- 引用idCard属性所对应的主键 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<property name="age"/>
<!-- 一对一 通过属性idCard定义的类型来与改表进行映射-->
<one-to-one name="idCard" constrained="true" cascade="save-update"/>
</class>
public class IdCard {
private int id;
private String code;
}
<class name="IdCard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="code"/>
</class>
生成的语句:
alter table Person
add constraint FK_3blpx78aucutb5umaelf9essh
foreign key (id)
references IdCard (id)
说明:
通过一个属性的定义类型来找到映射的关联实体类。
5 基于主键的双向一对一关联。
与基于主键的单向一对一关联类似,只需要两个实体的配置文件中互相通过属性的类型来相关映射。
public class Person {
private int id;
private String name;
private int age;
private IdCard idCard;
}
<class name="Person">
<id name="id">
<!-- foreign表示引用外键 -->
<generator class="foreign">
<!-- 引用idCard属性所对应的主键 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<property name="age"/>
<!-- 一对一 -->
<one-to-one name="idCard" constrained="true" cascade="save-update"/>
</class>
public class IdCard {
private int id;
private String code;
private Person person;
}
<class name="IdCard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="code"/>
<one-to-one name="person"/>
</class>
生成关联SQL语句:
alter table Person
add constraint FK_3blpx78aucutb5umaelf9essh
foreign key (id)
references IdCard (id)