您的位置:首页 > 其它

Hibernate中的映射关系(一)

2016-04-27 21:37 281 查看
      在Hibernate的学习中,最最主要的就是Hibernate中的几种常用的映射关系了。
(一)单项一对一的映射

    案例:在生活中,我们每个人都有一个身份证号,所以当我们存储人和身份证号信息的时候就是一种一对一的映射关联关系:



实现方式的原理很简单,就是将Person表和IDCard表的主键设置成一致的,这样就可以使得Person表中的每条记录都与IDCard表中的记录唯一对应。

    具体实现方式:

    1.因为是单项的一对一,所以只在Person端注入IDCard,即在Person实体中加入IDCard属性:private IdCard idcard;

    2.在Person 的配置文件Person.hbm.xml中配置如下:

<span style="font-size:18px;"><hibernate-mapping >
<class name="com.lcy.hibernate.Person" table="t_person">
<id name="id">
<!-- 采用foreign生成策略,foreign会取得关联对象的标识  -->
<generator class="foreign">
<!-- property 只关联对象 -->
<param name="property">idcard</param>
</generator>

</id>
<property name="name" />
<!-- name:关联对象的属性,constrained: =true 的时候表示,当前主键(person的主键)还是一个外键
参照了对端的主键(IDCard的主键),也就是会生成外键约束语句
-->
<one-to-one name="idcard" constrained="true"/>

</class>

</hibernate-mapping></span>
     值得注意的是在该配置文件中,主键id的生成策略是“foreign”。另外在<one-to-one>标签中设置constrained属性为true,表示是当前主键还是一个外键。

     除此之外,采用foreign映射策略在保存person对象的同时也会保存关联的对象,也就是idCard,他们之间还有级联关系。但是反之就不可以,也就是说,如果只保存IdCard对象,是会出错的,不会保存Person对象,因为关系的维护端在Person端,IdCard根本就不知道Person的存在。主键关联映射有弊端,不好维护。
(二)双向一对一映射

    与单项一对一映射关系不同的是,双向一对一映射弥补了前者的不足——在保存IDCard信息的时候会存储失败。相应的修改就是:

    1.在IdCard实体中加入Person属性:private Peron person;

    2.在IdCard的配置文件中配置Person属性信息:

<span style="font-size:18px;"><span style="font-size:24px;"><hibernate-mapping >
<class name="com.lcy.hibernate.IdCard" table="t_idCard" >
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo" />

<one-to-one name="person"></one-to-one>
</class>
</span>
</hibernate-mapping></span>
注1:one-to-one标签不影响存储,只影响加载,不会修改数据库,也就是说不会添加字段,而many-to-one会修改数据库,会增加一个字段。
 (三)多对一映射

    案例:我们都知道,在一个班级中有多个学生,而一个学生对应只属于一个班级,或者说一个人只属于一个组,而一个组有多个个人:



    实现方式也就和我们设计数据库的时候一样,在多的一方的数据表中加入一个外键。

    具体实现方式:

    1.在User实体中加入Group属性:

private Group group;

public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
          2.在User的配置文件中设置:
<hibernate-mapping >
<class name="com.lcy.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name" />
<many-to-one name="group" column="groupid" cascade="save-update"/>

</class>

</hibernate-mapping>
     设置<many-to-one>标签,并制定是实体中的groupid列的值。

     设置cascade="save-update"的意义是:在保存数据的时候可以将关联的表中的数据一并保存,hibernate会首先保存关联对象。

未完,待续……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: