一对一关系在实际生活中是比较常见的,如果学生与身份证的关系,学生与档案的关系等等。
  一对一关系在Hibernate中的实现有两种方式,分别是主键关联和外键关联。
以主键关联
  主键关系的重点是:关联的两个实体共享一个主键值。
Student.hbm.xml
...
<hibernate-mapping>
 <class name="model.Student" table="student" lazy="true"><!--把类和表关联起来-->
  <id name="id" unsaved-value="null"><!--id的产生方式是uuid.hex-->
   <generator class="uuid.hex"/>
  </id>
  <property name="name" type="sring"/>
  <one-to-one name="cer"
    class="model.Certificate"
    fetch="join"
    cascade="all"
  /><!--映射对应的身份证对象-->
 </class>
</hibernate-mapping>
Certificate.hbm.xml
...
<hibernate-mapping>
 <class name="model.Certificate" table="certificate" lazy="true">
  <id name="id">
  <!--外键生成机制,引用stu对象的主键作为certificate数据表的主键和外键-->
   <generator class="foreign">
    <param name="property">stu</param>
   </generator>
  </id>
  <one-to-one name="stu"
    class="model.Student"
    constrained="true" <!--表示Certificate引用了stu的主键作为外键-->
  />
 </class>
</hibernate-mapping>
上述的两个配置文件在<one-to-one>标签中都没有设置column属性
(实际上<one-to-one>标签本身就没有column属性)。
以外键关联
  以外键关联的重点是:两个实体各自有不同的主键,但其中一个实体有一个外键引用
了另一个表的主键。
Student.hbm.xml
...
<hibernate-mapping>
 <class name="model.Student" table="student" lazy="true">
  <id name="id" nusaved-value="null">
   <generator class="uuid.hex"/>
  </id>
  <property name="name" type="sring"/>
  <one-to-one name="cer"
    class="model.Certificate"
    fetch="join"
    cascade="all"
  /><!--映射对应的身份证对象-->
 </class>
</hibernate-mapping>
可以看到Student.hbm.xml和以主键关联时的代码是一样的,并没有改变。
Certificate.hbm.xml
...
<hibernate-mapping>
 <class name="model.Certificate" table="certificate" lazy="true">
  <id name="id">
   <generator class="uuid.hex"/> <!--不再是foreign了-->
  </id>
  <many-to-one name="stu"
    class="model.Student"
    unique="true" <!--唯一的多对一,其实也就变成了一对一关系-->
    column="stu_id" 
  />
 </class>
</hibernate-mapping>
以外键关联的一对一,其实本质上变成了一对多的双向关联了,编写时直接
按照一对多和多对一的要求编写,最后在many-to-one这一边上加上一个
unique="true"即可。
	posted on 2007-12-29 14:00 
Ke 阅读(1776) 
评论(0)  编辑  收藏  所属分类: 
hibernate