Hibernate对象关系映射---一对一

Hibernate对象关系映射---一对一

  (2010-05-12 22:47:27)
标签: 

杂谈

 

使用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唯一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值