Hibernate关系映射详解
2011-12-11 19:07
260 查看
这篇文章很重要,是我有史以来最认真写的一篇文章了,希望和我同时初学者的同学重视下.
Hibernate关系映射讲解
在进行讲解之前,希望各位能够理解一些东西。对象之间的关系是比较复杂的;而在DB中表的关系则相对简单的很多,他们的关系基本都是通过键与键之间进行关联的(外键等)。DB中关系总共有一对多、多对一、一对一、多对多这四种,而关联方式又分为单向与双向,下面会分别介绍其在Hibernate中的转换方法。
一对多
一对多即在A表中的每一条数据都会与B表中的n条有关联;在这种情况下一般都是在B表添加一个字段用来当作外键与A表中的主键相关联。而这种关联反馈到Hibernate中时,单向有两种方法:
一种为在A表映射的类中添加一个集合,集合的泛型为B表映射的类,映射对象中存储的是B表中数据映射的对象,在关系映射文件中需要添加相应的<set></set>,该标签中需指定name属性用来表示集合中存储的对象,并且该标签中需要有两个子:<one-to-many/>设定class属性指定B表映射的类;<key/>需要设定column属性指定对应表中的哪一列,范例代码如下
<set name="emps">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
另一种是在B表中添加一个A表映射类的对象。在关系映射文件中需要添加<many-to-one/>,需要指定name属性指定对象名称,column属性指定对应表中的字段名称,范例代码如下
<many-to-one name="depart"column="depart_id"/>
双向管理即两种单向关联同时加入即可。
多对一
多对一其实与一对多是一样的,所以记住一种即可
注:多对一(一对多)作为最基础的关系映射一定要掌握熟练。
一对一
一对一即在A表中的每一条数据都会与B表中的1条数据有关联;这种情况下在DB中可以在任意表中创建一个字段与另一个表的主键形成关联外键,亦可以直接将某一表的主键直接设置成外键与另一表的主键关联。在Hbiernatez中同样的有单向关联与双向关联,双向关联也是两种单向关联同时应用而已。
首先在一对一关联中需要搞清楚两个表的主从关系,比如一个人与一张身份证,一张身份证只能属于一个人,主就是人。所以在人的关系映射文件中即需要添加<one-to-one/>标签,范例如下
<one-to-one name="idCard"></one-to-one>
而如果在身份证的关系映射文件中则需要添加<many-to-one/>标签,因为身份证与人的关系相当于多对一的关系(这里比较繁琐,需要仔细想想,推敲一下,就明白了)。范例如下
<many-to-one name="person" column="person_id"/>
另外一种将主键直接设置成外键的方法,在关系映射文件中需要将主键标签<generator>中的class属性设置为”foreign”,并添加<param>子标签,标签体为关联的对象名称。范例如下
<id name="id"column="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
多对多
多对多的关系比较复杂,在DB中体现为需要创建第三张表C表,用来存放A表与B表的主键,并同时将这两个主键作为C表的主键。其实也可以看成A表与C表形成了多对一的关系,同时A表与C表也行程了多对一的关系,这样在Hibernate中则只需要将A表映射的类与B表映射的类分别添加一个集合属性,泛型指定对方为对方类即可,在关系表中则需要在<set></set>标签中添加<many-to-many>的子标签即可。
注:在实际应用中,多对多关系的查询是十分缓慢的,所以应尽量避免多对多关系的出现。
Hibernate关系映射讲解
在进行讲解之前,希望各位能够理解一些东西。对象之间的关系是比较复杂的;而在DB中表的关系则相对简单的很多,他们的关系基本都是通过键与键之间进行关联的(外键等)。DB中关系总共有一对多、多对一、一对一、多对多这四种,而关联方式又分为单向与双向,下面会分别介绍其在Hibernate中的转换方法。
一对多
一对多即在A表中的每一条数据都会与B表中的n条有关联;在这种情况下一般都是在B表添加一个字段用来当作外键与A表中的主键相关联。而这种关联反馈到Hibernate中时,单向有两种方法:
一种为在A表映射的类中添加一个集合,集合的泛型为B表映射的类,映射对象中存储的是B表中数据映射的对象,在关系映射文件中需要添加相应的<set></set>,该标签中需指定name属性用来表示集合中存储的对象,并且该标签中需要有两个子:<one-to-many/>设定class属性指定B表映射的类;<key/>需要设定column属性指定对应表中的哪一列,范例代码如下
<set name="emps">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
另一种是在B表中添加一个A表映射类的对象。在关系映射文件中需要添加<many-to-one/>,需要指定name属性指定对象名称,column属性指定对应表中的字段名称,范例代码如下
<many-to-one name="depart"column="depart_id"/>
双向管理即两种单向关联同时加入即可。
多对一
多对一其实与一对多是一样的,所以记住一种即可
注:多对一(一对多)作为最基础的关系映射一定要掌握熟练。
一对一
一对一即在A表中的每一条数据都会与B表中的1条数据有关联;这种情况下在DB中可以在任意表中创建一个字段与另一个表的主键形成关联外键,亦可以直接将某一表的主键直接设置成外键与另一表的主键关联。在Hbiernatez中同样的有单向关联与双向关联,双向关联也是两种单向关联同时应用而已。
首先在一对一关联中需要搞清楚两个表的主从关系,比如一个人与一张身份证,一张身份证只能属于一个人,主就是人。所以在人的关系映射文件中即需要添加<one-to-one/>标签,范例如下
<one-to-one name="idCard"></one-to-one>
而如果在身份证的关系映射文件中则需要添加<many-to-one/>标签,因为身份证与人的关系相当于多对一的关系(这里比较繁琐,需要仔细想想,推敲一下,就明白了)。范例如下
<many-to-one name="person" column="person_id"/>
另外一种将主键直接设置成外键的方法,在关系映射文件中需要将主键标签<generator>中的class属性设置为”foreign”,并添加<param>子标签,标签体为关联的对象名称。范例如下
<id name="id"column="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
多对多
多对多的关系比较复杂,在DB中体现为需要创建第三张表C表,用来存放A表与B表的主键,并同时将这两个主键作为C表的主键。其实也可以看成A表与C表形成了多对一的关系,同时A表与C表也行程了多对一的关系,这样在Hibernate中则只需要将A表映射的类与B表映射的类分别添加一个集合属性,泛型指定对方为对方类即可,在关系表中则需要在<set></set>标签中添加<many-to-many>的子标签即可。
注:在实际应用中,多对多关系的查询是十分缓慢的,所以应尽量避免多对多关系的出现。
相关文章推荐
- Hibernate对象关系映射详解之“一对多”关系映射
- hibernate中List一对多映射关系详解
- Hibernate 关系映射配置inverse与cascade详解
- JAVAWEB开发之Hibernate详解(四)——持久化类的继承映射关系
- Hibernate关系映射详解
- hibernate映射详解之: 对象 - 关系映射
- Hibernate 学习之路(四):详解 hibernate 映射文件(二)和组件映射关系
- Hibernate之关系对象映射详解
- SSH——Hibernate继承关系映射详解(配置+实例+总结)
- hibernate(五) hibernate一对一关系映射详解
- 关于hibernate中持久化类之间的映射关系的详解(一)
- Hibernate中 多对一,一对多映射关系分析详解
- 关于hibernate中持久化类之间的映射关系的详解(一)
- Hibernate两种实体关系映射详解
- hibernate中List一对多映射关系详解
- hibernate学习(1):hibernate基本架构和关系映射详解
- Hibernate框架详解(三)框架中的关系映射
- Hibernate中映射关系 一对一 详解
- JAVAWEB开发之Hibernate详解(四)——持久化类的继承映射关系
- [翻译] hibernate映射继承关系(一):一张表对应一整棵类继承树