一对一关联映射 (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>