一对一关系在实际生活中是比较常见的,如果学生与身份证的关系,学生与档案的关系等等。
一对一关系在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 阅读(1760)
评论(0) 编辑 收藏 所属分类:
hibernate