hibernate几种映射关系:
下面主要介绍关联映射。关联映射就是将对象的关联关系映射到数据库中。
关联映射包括:一对多关联映射、多对一关联映射、多对多关联映射
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>属性。
一的一端维护数据时,加载一时能够加载出多的数据,多的一端维护数据时,加载多时能够加载一的数据。