写在前面
Hibernate中关系的映射共有以下四种:一对多、多对一、一对一、多对多这四种。
一对多单向关联 xml映射
一对多即在A表中的每一条数据都会与B表中的n条有关联;在这种情况下一般都是在B表添加一个字段用来当作外键与A表中的主键相关联。而这种关联反馈到Hibernate中时,单向有两种方法:
一种为在A表映射的类中添加一个集合,集合的泛型为B表映射的类,映射对象中存储的是B表中数据映射的对象,在关系映射文件中需要添加相应的,该标签中需指定name属性用来表示集合中存储的对象,并且该标签中需要有两个子:设定class属性指定B表映射的类;需要设定column属性指定对应表中的哪一列,范例代码如下
<!-- depart_id为外键 -->
<set name="emps">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
另一种是在B表中添加一个A表映射类的对象。在关系映射文件中需要添加,需要指定name属性指定对象名称,column属性指定对应表中的字段名称,范例代码如下
<!-- depart_id为外键 -->
<many-to-one name="depart" column="depart_id"/>
一对多双向关联 xml映射
双向管理即两种单向关联同时加入即可。为节省版面,就不在此书写了
多对一单向,双向关联映射 xml映射
多对一其实与一对多是一样的,只要弄清楚里面的几个属性的配置,只要掌握一种,另一种就自然学会了。
一对一映射 xml映射
一对一即在A表中的每一条数据都会与B表中的1条数据有关联;这种情况下在DB中可以在任意表中创建一个字段与另一个表的主键形成关联外键,亦可以直接将某一表的主键直接设置成外键与另一表的主键关联。在Hbiernatez中同样的有单向关联与双向关联,双向关联也是两种单向关联同时应用而已。
首先在一对一关联中需要搞清楚两个表的主从关系,比如一个人与一张身份证,一张身份证只能属于一个人,主就是人。所以在人的关系映射文件中即需要添加标签,范例如下
<one-to-one name="idCard"></one-to-one>
而如果在身份证的关系映射文件中则需要添加标签,因为身份证与人的关系相当于多对一的关系(这里比较繁琐,需要仔细想想,推敲一下,就明白了)。范例如下
<many-to-one name="person" column="person_id"/>
另外一种将主键直接设置成外键的方法,在关系映射文件中需要将主键标签中的class属性设置为”foreign”,并添加子标签,标签体为关联的对象名称。范例如下
<id name="id"column="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
多对多映射 xml映射
多对多的关系比较复杂,在DB中体现为需要创建第三张表C表,用来存放A表与B表的主键,并同时将这两个主键作为C表的主键。其实也可以看成A表与C表形成了多对一的关系,同时A表与C表也行程了多对一的关系,这样在Hibernate中则只需要将A表映射的类与B表映射的类分别添加一个集合属性,泛型指定对方为对方类即可,在关系表中则需要在标签中添加的子标签即可。
注:在实际应用中,多对多关系的查询是十分缓慢的,所以应尽量避免多对多关系的出现。