Hibernate多对多关联映射
2015-04-28 20:52
253 查看
前几篇博客分别讲了一对一映射、一对多映射、多对一映射,这篇主要总结一下多对多映射的单双向知识。
多对多关联映射的原理就是将多对多关联映射分解为一对多或多对一的情况来分析。结合实例用户和角色的关系(一个用户可以有多个角色,而一个角色也可以给多个用户)来进行理解。
单向:User端知道Role端的存在,先看一张用户和角色的单向UML的图:
User类和User.hbm.xml:
Role类和Role.hbm.xml:
双向:User端和Role端互相知道对方的存在,User类和User.hbm.xml代码相同。不同于单向的是:Role类和Role.hbm.xml。
映射的结果是:
多对多关联映射会生成三张表,一张表t_user,t_role和t_user_role.主要是第三张表维护他们之间的关系。这跟我们学习的数据库设计原理是一致的。从这里我们也可以充分理解一下多对多的根本还是一对多或者多对一。我们以t_user_role为观察角度,从t_user_role观察t_user,你会发现他们之间的关系是多对一,同理t_user_role和t_role也是多对一。
如上这样的映射结果,我们看到第三张表中只有两个字段:user_id和role_id.那么我们想在第三张表中添加其他字段呢。比如学生和课程多对多的关系,生成第三张表成绩表,中除了有student_id、couser_id还有score。那么这时score这个字段怎么能映射出来?
针对这种情况,目前我能想到的是将第三张表抽象为第三个实体,让它本身作为实体存在。那么映射的时候就没有了多对多的映射,而是student和score之间的一对多的关联映射和course和score之间的一对多的关联映射。原理还是一样的。
hibernate基本映射就这么多的博客了,接下来继续总结SSH的知识。
多对多关联映射的原理就是将多对多关联映射分解为一对多或多对一的情况来分析。结合实例用户和角色的关系(一个用户可以有多个角色,而一个角色也可以给多个用户)来进行理解。
单向:User端知道Role端的存在,先看一张用户和角色的单向UML的图:
User类和User.hbm.xml:
package com.bjpowernode.hibernate; import java.util.Set; public class User { private int id; private String name; private Set roles; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getRoles() { return roles; } public void setRoles(Set roles) { this.roles = roles; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjpowernode.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="user_id"/> <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> </set> </class> </hibernate-mapping>
Role类和Role.hbm.xml:
package com.bjpowernode.hibernate; public class Role { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjpowernode.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
双向:User端和Role端互相知道对方的存在,User类和User.hbm.xml代码相同。不同于单向的是:Role类和Role.hbm.xml。
package com.bjpowernode.hibernate; import java.util.Set; public class Role { private int id; private String name; private Set users; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getUsers() { return users; } public void setUsers(Set users) { this.users = users; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.bjpowernode.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="users" table="t_user_role"> <key column="role_id" not-null="true"/> <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/> </set> </class> </hibernate-mapping>
映射的结果是:
多对多关联映射会生成三张表,一张表t_user,t_role和t_user_role.主要是第三张表维护他们之间的关系。这跟我们学习的数据库设计原理是一致的。从这里我们也可以充分理解一下多对多的根本还是一对多或者多对一。我们以t_user_role为观察角度,从t_user_role观察t_user,你会发现他们之间的关系是多对一,同理t_user_role和t_role也是多对一。
如上这样的映射结果,我们看到第三张表中只有两个字段:user_id和role_id.那么我们想在第三张表中添加其他字段呢。比如学生和课程多对多的关系,生成第三张表成绩表,中除了有student_id、couser_id还有score。那么这时score这个字段怎么能映射出来?
针对这种情况,目前我能想到的是将第三张表抽象为第三个实体,让它本身作为实体存在。那么映射的时候就没有了多对多的映射,而是student和score之间的一对多的关联映射和course和score之间的一对多的关联映射。原理还是一样的。
hibernate基本映射就这么多的博客了,接下来继续总结SSH的知识。
相关文章推荐
- 千山万水之Hibernate(七)——关联映射(多对多)
- Hibernate教程05_关系映射之一对一双向外键关联
- Hibernate 多表关联映射- Hibernate中使用的集合类型(set,list,array,bag,map)
- Hibernate 、继承关联映射
- Hibernate关联映射之_一对一
- hibernate关联映射:多对一、一对一
- Hibernate中 一对一 唯一外键关联映射
- Hibernate中的基本映射和多对一关联映射
- hibernate中关联映射的学习总结
- Hibernate关联映射(2)2015-07-11
- hibernate:多对一单向关联映射
- Hibernate(1)关联映射之一对多
- Hibernate 关系关联映射和cascade与inverse
- Hibernate高级实体关联映射之多值的实体关联(一对多关联,利用联结表,bag例)
- hibernate关联映射
- Hibernate高级实体关联映射之多值的实体关联(实体类实现三重关联)
- Hibernate 映射关系 ---Many2Many 单向关联
- 【Hibernate】多对一与一对多关联映射
- Hibernate 关联映射
- Hibernate关联映射之多对一/一对多双向关联映射