使用Hibernate来进行对象关系的一对一映射,可以使用主键关联和外键关联两种方式来实现。
1。主键关联。数据表中相互关联的数据信息通过拥有相同的主键值来进行关联,如丈夫和妻子,如果他们有相同的结婚证号,则认为他们是一对夫妻,在数据表中将结婚证号来作为丈夫表和妻子表的主键。持久化对象一面分别是丈夫拥有妻子这个对象,妻子拥有丈夫这个对象。如:
public class HusbandPO {
private int id;
private String name;
private WifePO myWife;
......
}
public class WifePO {
private int id;
private String name;
private HusbandPO myHus;
......
}
关系映射文件就该这样写:
假设HusbandPO是主控类
<hibernate-mapping>
<class name="com.lovo.po.HusbandPO" table="Husband">
<id name="id" column="id" type="integer">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<one-to-one name="myWife" class="com.lovo.po.WifePO" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
由于妻子的主键是从丈夫那里得到的,所以在配置妻子的主键生成方式时应注意,配置<generator class="foreign"><param name="property">myHus</param></generator>表示主键的值是从外部得到,<param>表示是在自己的属性中取值。
<hibernate-mapping>
<class name="com.lovo.po.WifePO" table="Wife">
<id name="id" column="id" type="integer">
<generator class="foreign">
<param name="property">myHus</param>
</generator>
</id>
<property name="name" column="name" type="string"></property>
<one-to-one name="myHus" class="com.lovo.po.HusbandPO"></one-to-one>
</class>
</hibernate-mapping>
2.外键关联。假设在夫妻关系中,妻子表中有对丈夫主键引用的外键,这个外键应该是唯一的。通常拥有外键的一方都是可能有多个值对应所应用的一方的,如果限制了外键唯一,那么多对一的情况就变成一对一了,所以使用外键关联实现的一对一映射实际是多对一的特例。
如下设置配置文件:
HusbandPO.hbm.xml
<hibernate-mapping>
<class name="com.lovo.po.HusbandPO" table="Husband">
<id name="id" column="id" type="int">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<one-to-one name="myWife" class="com.lovo.po.WifePO" property-ref="myHusband" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
WifePO.hbm.xml
<hibernate-mapping>
<class name="com.lovo.po.WifePO" table="Husband">
<id name="id" column="id" type="int">
<generator class="increment"></generator>
</id>
<property name="name" column="name" type="string"></property>
<many-to-one name="myHusband" class="com.lovo.po.HusbandPO" cascade="all" unique="true" column="f_husbandid"></many-to-one>
</class>
</hibernate-mapping>
通常把握有外键的一方看做多方,故在WifePO.hbm.xml文件中设置了<many-to-one>,并在其中设置了unique属性为true表示外键f_husbandid唯一。