一对一关联(用户与身体证号的关系)
实际上是many-to-one的特例
外键单向关联
可以采用many-to-one的标签指定“多”的一端的unique="true",即限制“多”
”一”的端的多重性为“一”,通过这种手段来实现一对一关联
这种方法会添加一个外键,指向另外一端的主键(IdCard)
Person.hbm.xml
<hibernate-mapping>
<class name="com.hibernate.onetooneufk1.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
<hibernate-mapping>
<class name="com.hibernate.onetooneufk1.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
外键双向关联
双向关联需要在另外一端(IdCard)端添加<one-to-one>标签,
指示hibernate如何加载其引用对象,默认情况下会根据主键匹配进行加载Person
因为外键关联映射中,两个实体的关系是由person的外键idcard维护的,所以不能指定
使用person的主键对person进行加载,而要根据Person的外键idcard进行加载,如:
<one-to-one name="person" property-ref="idCard" />
Person.hbm.xml
<hibernate-mapping>
<class name="com.hibernate.onetooneufk2.Person" table="t_person4">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique-key="true"/>
</class>
</hibernate-mapping>
IdCard.hbm.xml
<hibernate-mapping>
<class name="com.hibernate.onetooneufk2.IdCard" table="t_idcard4">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person" property-ref="idCard" />
</class>
</hibernate-mapping>
主键单向关联
主键关系:即让两个对象的id保持相同,这样可以避免多余的字段被创建
<one-to-one>标签指示Hibernate如何加载其引用对象,缺省情况下根据主键加载引用对象
Person.hbm.xml
<hibernate-mapping>
<class name="com.hibernate.onetoonepk1.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.hbm.xml
<hibernate-mapping>
<class name="com.hibernate.onetoonepk1.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
主键双向关联
需要在idCard中加入<one-to-one>指向person,告知Hibernate如何加载person,
缺省情况下根据主键加载
Person.hbm.xml
<hibernate-mapping auto-import="false">
<class name="com.hibernate.onetoonepk2.Person" table="t_person2">
<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.hbm.xml
<hibernate-mapping auto-import="false">
<class name="com.hibernate.onetoonepk2.IdCard" table="t_idcard2">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person"/>
</class>
</hibernate-mapping>