读书人

Hibernate联系关系映射(三)一对一

发布时间: 2012-09-14 11:53:44 作者: rapoo

Hibernate关联映射(三)一对一
一对一关联映射(one-to-one)
两个对象之间,是一对一的关系。如:Person 和 IdCard

有两种实现方式可以完成一对一的关联映射:
1.主键关联
让两个对象具有相同的主键值,以表明他们之间一一对应的关系,数据库表不会有额外的字段来维护他们之间的关系,仅仅通过两张表的相同主键来关联。

2.唯一外键关联:和多对一配置一样,只不过用了唯一的限制。


a)主键关联(单向)

Person.java

public class Person  implements java.io.Serializable {     private Integer id;     private String name;     private Idcard idCard;}


IdCard.java
public class Idcard  implements java.io.Serializable {     private int id;     private String cardNumber;}


一对一主键关联映射:让两个对象的ID保持相同,这样可以避免对于的字段被创建。

Person.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2010-8-30 10:14:10 by Hibernate Tools 3.2.1.GA --><hibernate-mapping>    <class name="org.jzkangta.hibernate.Person" table="person" catalog="ibatisdb">        <id name="id" type="java.lang.Integer">             <generator >                <!-- Person中的ID来源与Idcard实体共享主键 -->                <param name="property">idCard</param>            </generator>        </id>        <property name="name" type="string">            <column name="name_" length="50" />        </property>        <!-- constrained="true"当前主键存在一个约束,表明Person中的主键作为外键参照了idCard-->       <one-to-one name="idCard" constrained="true"/>    </class></hibernate-mapping>


b)主键关联(双向)

IdCard实体要加上Persin的引用

IdCard.java
public class Idcard  implements java.io.Serializable {     private int id;     private String cardNumber;     private Person person;}


IdCard.hbm.xml
<hibernate-mapping>    <class name="org.jzkangta.hibernate.Idcard" table="idcard" catalog="ibatisdb">        <id name="id" type="int">            <column name="id_" />            <generator />        </id>        <property name="cardNumber" type="string">            <column name="card_number_" length="20" />        </property>        <one-to-one name="person" />    </class></hibernate-mapping>

<one-to-one name="person" />
指示Hibernate如何加载person,默认情况下,根据主键加载


c)一对一唯一外键关联(单向)
Person.hbm.xml
<hibernate-mapping>    <class name="org.jzkangta.hibernate.Person" table="person" catalog="ibatisdb">        <id name="id" type="java.lang.Integer">        <!--  唯一外键的话,这里就不需要了            <generator >                Person中的ID来源与Idcard实体共享主键                 <param name="property">idCard</param>            </generator>         -->         <generator />        </id>        <property name="name" type="string">            <column name="name_" length="50" />        </property>        <!-- constrained="true"当前主键存在一个约束,表明Person中的主键作为外键参照了idCard       <one-to-one name="idCard" constrained="true"/>       -->       <!-- unique="true"没有这个的话 就是一个多对一,加上之后就有了唯一的限制了-->       <many-to-one name="idCard" unique="true"/>    </class></hibernate-mapping>


一对一唯一外键关联实际上是多对一关联映射的特例。
<many-to-one name="idCard" unique="true"/>


d)一对一唯一外键关联(双向)

同样是在IdCard实体加上Person的引用
Idcard.hbm.xml
<hibernate-mapping>    <class name="org.jzkangta.hibernate.Idcard" table="idcard" catalog="ibatisdb">        <id name="id" type="int">            <column name="id_" />            <generator />        </id>        <property name="cardNumber" type="string">            <column name="card_number_" length="20" />        </property>        <one-to-one name="person" property-ref="idCard"/>    </class></hibernate-mapping>


读书人网 >软件架构设计

热点推荐