您的位置:首页 > 其它

hibernate关系映射——关联映射

2012-11-28 17:35 267 查看
hibernate几种映射关系:

关联映射
继承映射
复合主键映射
Component映射
集合映射

下面主要介绍关联映射。关联映射就是将对象的关联关系映射到数据库中。
关联映射包括:一对多关联映射、多对一关联映射、多对多关联映射
1. 一对多关联映射
一对多关联关系分为单项关联关系和双项关联关系。
(1)单项关联
Group (1)----->User(*)
从对象关系图中可以看出,在Group对象中持有User对象的集合。
添加数据时,由Group一端维护关系,维护的是t_user表中的groupid字段。
group.hbm.xml:
<set name="user">

<key column="groupid"/> //关联的外键为groupid

<one-to-many class="com.bjpowernode.hibernate.Group"/>

</set>
加载数据时,加载group的同时,能够将user加载出来。
缺点:
a. 因为User一端不知道Group的存在(因为User没有维护关系),所以,在保存User时,关系字段groupid是为null的,如果将该字段设置为非空,则将无法保存数据。
b. 由于是Group维护关系,所以,每次添加数据时,group都要执行update命令来更新User中的groupid字段。
Hibernate: insert into t_user (name) values (?)

Hibernate: insert into t_group (name) values (?)

Hibernate: update t_user set groupid=? where id=? //每次插入时都要生成update语句
下面介绍的双项关联,解决了单项关联的缺点。
(2) 双项关联
Group (1)-----User(*)
从对象关系图中可以看出,在Group对象中持有User对象的集合;在User中持有Group对象的引用。
添加数据时,多的一端维护数据,group一端维护关系的语句设置为失效(inverse=true),维护的是t_user表中的groupid字段。
user.hbm.xml:

<many-to-one name="classes" column="classesid"/>

group.hbm.xml:

<set name="students" inverse ="true">
<key column="classesid"/>

<one-to-many class="com.bjpowernode.hibernate.Student"/>

</set>

加载数据时,同单项关联关系一样,加载group的同时,能够将对应的user加载上来;和单项关联关系不同的是,加载user的同时,也能够将group加载上来。这是单项关联无法做到的。实际上,由加载多的一端加载出一的数据是更合理的。

2. 多对一关联映射

多对一关联映射和一对多的双项关联类似,都是在多的一端持有一的一端的集合。都是用<many-to-one>属性,在加载多的时候能够将一的信息加载上来。

3. 多对多关联映射

(1) 单项关联映射

User(*)----->Role(*)

从对象关系中可以看出,在User中持有Role的集合。

添加数据时,User维护关系,维护的是一个第三方表t_user_role

user.hbm.xml:

<set name="roles" table="t_user_role">

<key column="user_id"></key>

<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" />

</set>

在加载数据的时候,加载User时能够同时加载Role的信息。

(2) 双项关联映射

User(*)-----role(*)

从对象关系中可以看出,双方对象中互相持有对方的集合。

添加数据时,共同维护第三方表t_user_role

user.hbm.xml:

<set name="roles" table="t_user_role">

<key column="user_id"></key>

<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" />

</set>

role.hbm.xml:

<set name="users" table="t_user_role">

<key column="role_id"></key>

<many-to-many class="com.bjpowernode.hibernate.User" column="user_id"

</set>

加载数据时,从任意一方都能够加载出对应的另一方的信息。



一对多关联映射:通过在多的一端加入一个外键,指向一的一端来维护关系。

多对一关联映射:通过在多的一端加入一个外键,指向一的一端来维护关系。

多对多关联映射:通过一张第三方表来维护关系。

我觉得映射关系只要按照对象之间的关系来对应就好了。一对多的单项关联就是在一的一端持有多的一端的集合,双向关联就是一的一端持有多的一端的集合,多的一端持有一的一端的引用。 多对多就是双方互相持有对方的集合。

在单项关联中,哪个对象持有对方的集合或者引用,哪个对象维护关系。在双项关联中,双方共同维护关系。

多对一的关系用<many-to-one>属性 ,一对多用<one-to-many>属性, 多对多用<many-to-many>属性。

一的一端维护数据时,加载一时能够加载出多的数据,多的一端维护数据时,加载多时能够加载一的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: