一对一关联映射 (one-to-one)
两个对象之间是一对一的关系,如Person-IdCard,有两种策略可以实现一对一的关联映射
主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系;
一、一对一主键关联映射-单向(Person---->IdCard)
Person类
publicclass Person {
private int id;
private IdCard idCard;
}
映射文件
<hibernate-mapping>
<class name="com.wsz.entity.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>
</hibernate-mapping>
IdCard类
publicclass IdCard{
private int id;
private String idnumber;
}
映射文件
<hibernate-mapping>
<class name="com.wsz.entity.Id_Card" table="t_idcard">
<id name="id">
<generator class="native" />
</id>
<property name="idnumber" />
</class>
</hibernate-mapping>
二、一对一主键关联映射-双向(Person<---->IdCard)
Person类
publicclass Person {
private int id;
private IdCard idCard;
}
映射文件
<hibernate-mapping>
<class name="com.wsz.entity.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>
</hibernate-mapping>
IdCard类
publicclass IdCard{
private int id;
private String idnumber;
private Person person;
}
映射文件
<hibernate-mapping>
<class name="com.wsz.entity.Id_Card" table="t_idcard">
<id name="id">
<generator class="native" />
</id>
<property name="idnumber" />
<one-to-one name="person"></one-to-one>
</class>
</hibernate-mapping>
三、一对一唯一外键关联映射-单向(Person---->IdCard)
注意: 一对一唯一外键关联映射 是 多对一关联映射的特例
可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
person.hbm.xml
<class name="com.bjsxt.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--数据库中person中会有一个idCard字段作为外键 参照 IdCard的主键-->
<many-to-one name="idCard" unique="true"/>
</class>
IdCard.hbm.xml
<hibernate-mapping>
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
四、一对一唯一外键关联映射--双向关联 (Person<---->IdCard)
一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载其关联对象,
默认根据idcard主键 --> person主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,所以不能根据person主键加载person,而要根据idcard主键 --> person的外键加载person,所以采用如下映射方式: <one-to-one name="person" property-ref="idCard"/>
Person.hbm.xml
<hibernate-mapping>
<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>
</hibernate-mapping>
IdCard.hbm.xml
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<!--one-to-one不会在数据库中加外键字段,只是告诉hibernate如何去加载关联对象
property-ref="idCard"表示不是根据person主键加载,而是根据person的idCard字段加载
-->
<one-to-one name="person" property-ref="idCard"/>
</class>