Hibernate关系映射讲解

来源:互联网 发布:淘宝分销代销的区别 编辑:程序博客网 时间:2024/05/21 07:07


Hibernate关系映射讲解

在进行讲解之前,希望各位能够理解一些东西。对象之间的关系是比较复杂的;而在DB中表的关系则相对简单的很多,他们的关系基本都是通过键与键之间进行关联的(外键等)。DB中关系总共有一对多、多对一、一对一、多对多这四种,而关联方式又分为单向与双向,下面会分别介绍其在Hibernate中的转换方法。

一对多

一对多即在A表中的每一条数据都会与B表中的n条有关联;在这种情况下一般都是在B表添加一个字段用来当作外键与A表中的主键相关联。而这种关联反馈到Hibernate中时,单向有两种方法:

一种为在A表映射的类中添加一个集合,集合的泛型为B表映射的类,映射对象中存储的是B表中数据映射的对象,在关系映射文件中需要添加相应的<set></set>,该标签中需指定name属性用来表示集合中存储的对象,并且该标签中需要有两个子:<one-to-many/>设定class属性指定B表映射的类;<key/>需要设定column属性指定对应表中的哪一列,范例代码如下

[html] view plaincopy
  1. <set name="emps">  
  2.            <key column="depart_id"/>  
  3.            <one-to-many class="Employee"/>  
  4.  </set>  


 

另一种是在B表中添加一个A表映射类的对象。在关系映射文件中需要添加<many-to-one/>,需要指定name属性指定对象名称,column属性指定对应表中的字段名称,范例代码如下

[html] view plaincopy
  1. <many-to-one name="depart"column="depart_id"/>  


双向管理即两种单向关联同时加入即可。

多对一

多对一其实与一对多是一样的,所以记住一种即可

 

注:多对一(一对多)作为最基础的关系映射一定要掌握熟练。

 

一对一

  一对一即在A表中的每一条数据都会与B表中的1条数据有关联;这种情况下在DB中可以在任意表中创建一个字段与另一个表的主键形成关联外键,亦可以直接将某一表的主键直接设置成外键与另一表的主键关联。在Hbiernatez中同样的有单向关联与双向关联,双向关联也是两种单向关联同时应用而已。

  首先在一对一关联中需要搞清楚两个表的主从关系,比如一个人与一张身份证,一张身份证只能属于一个人,主就是人。所以在人的关系映射文件中即需要添加<one-to-one/>标签,范例如下

[html] view plaincopy
  1. <one-to-one name="idCard"></one-to-one>  


而如果在身份证的关系映射文件中则需要添加<many-to-one/>标签,因为身份证与人的关系相当于多对一的关系(这里比较繁琐,需要仔细想想,推敲一下,就明白了)。范例如下

[html] view plaincopy
  1. <many-to-one name="person" column="person_id"/>  


  另外一种将主键直接设置成外键的方法,在关系映射文件中需要将主键标签<generator>中的class属性设置为”foreign”,并添加<param>子标签,标签体为关联的对象名称。范例如下

[html] view plaincopy
  1. <id name="id"column="id">  
  2.        <generator class="foreign">  
  3.            <param name="property">person</param>  
  4.        </generator>  
  5. </id>  


 

多对多

多对多的关系比较复杂,在DB中体现为需要创建第三张表C表,用来存放A表与B表的主键,并同时将这两个主键作为C表的主键。其实也可以看成A表与C表形成了多对一的关系,同时A表与C表也行程了多对一的关系,这样在Hibernate中则只需要将A表映射的类与B表映射的类分别添加一个集合属性,泛型指定对方为对方类即可,在关系表中则需要在<set></set>标签中添加<many-to-many>的子标签即可。

注:在实际应用中,多对多关系的查询是十分缓慢的,所以应尽量避免多对多关系的出现。


0 0
原创粉丝点击