上篇博文【SSH进阶之路】Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础。
多对多映射是现实生活中最常见的映射,也是最容易理解的映射。废话少说,直接开始。
映射原理
不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联。用第三张表来解决可能会造成数据冗余的问题。
举例
一个用户(User)对多个角色(Role),一个角色对多个用户。
分类
单向的多对多关联映射(单向User--->Role)
对象模型
关系模型
实例
下面我们看一下实体类和映射文件的代码。
User
package com.liang.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 Set getRoles() { return roles; } public void setRoles(Set roles) { this.roles = roles; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Role
package com.liang.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; } }
User.hbm.xml
<?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 package="com.liang.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- roles属性,表达的是本对象(User)与Role的多对多的关系 --> <set name="roles" table="t_user_role"> <!--当前表(User)的主键--> <key column="user_id"></key> <many-to-many class="Role" column="role_id"></many-to-many> </set> </class> </hibernate-mapping>
Role.hbm.xml
<?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 package="com.liang.hibernate"> <class name="Role" table="t_role"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> </class> </hibernate-mapping>
生成的表结构和测试数据
多对多关联映射,在实体类中,跟一对多关联映射一样,也是用集合来表示的。<set>标签中用table属性重命名中间表名称,<key>标签定义当前表的主键,用<many-to-many>标签来关联另一张表。
双向的多对多关联映射(双向User<--->Role)
对象模型
关系模型
同上
实例
下面我们看一下实体类和映射文件的代码。
User
package com.liang.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 Set getRoles() { return roles; } public void setRoles(Set roles) { this.roles = roles; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Role
package com.liang.hibernate; import java.util.Set; public class Role { private int id; private String name; private Set users; public Set getUsers() { return users; } public void setUsers(Set users) { this.users = 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; } }
User.hbm.xml
<?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 package="com.liang.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- roles属性,表达的是本对象(User)与Role的多对多的关系 --> <set name="roles" table="t_user_role"> <!--当前表(User)的主键--> <key column="user_id"></key> <many-to-many class="Role" column="role_id"></many-to-many> </set> </class> </hibernate-mapping>
Role.hbm.xml
<?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 package="com.liang.hibernate"> <class name="Role" table="t_role"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- users属性,表达的是本对象(Role)与User的多对多的关系 --> <set name="users" table="t_user_role"> <!--当前表(Role)的主键--> <key column="role_id"></key> <many-to-many class="User" column="user_id"></many-to-many> </set> </class> </hibernate-mapping>
生成的表结构和测试数据
多对多双向关系中,User和Role的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。
总结
多对多关联映射到此就结束了,经过对一对多关联映射的学习,相对而言,多对多关联映射变得非常的简单了,非常像一对多关联映射的变体。
Hibernate的总结篇马上杀到,谢谢关注。
相关推荐
hibernate关联映射详解SSH 多对多,一对多关系对象映射
hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品
将spring的多对多映射包含的增删改差,是目前主流的编程思想
Hibernate映射配置详解
该资源总包括SSH框架整合中hibernate框架所需要的配置文件: (1)hibernate.cfg.xml (2)在JavaBean所在的包下映射的配置文件
hibernate 映射关系简单实例 、一对一 、一对多、多对一 、多对多
ssh全注解项目(一对一,一对多,多对多),hibernate的注解配置及映射关系
详细概述了Hibernate(ORM原理,核心配置,映射配置,一对一,一对多,多对多的关联关系)
Hibernate教程PPT;Hibernate教程 SSH ORM 对象-关系映射 HQL查询;Hibernate教程 SSH ORM 对象-关系映射 HQL查询
12.4.5 多对一单向关联的annotation注解实现538 12.4.6 一对多双向关联的annotation注解实现540 12.4.7 一对多双向自身关联的annotation注解实现542 12.4.8 多对多单向关联的annotation注解实现543 12.4.9 多对多...
主要介绍了Java的Hibernate框架中的多对一和一对多映射,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
4.4 Hibernate映射建表 4.5 配置Spring(AOP) 4.6 配置Spring(IOC) 4.7 大致分析业务逻辑定义部分Dao实现 4.8 测试Dao实现 4.9 分析JSP中要实现的功能在实体中建立实体方法 4.10 建立Struts2映射路径 4.11 分析...
ssh集成的小例子 涉及到Hibernate的关系映射,和增删改查的一些方法 (应用了MyEclipse 和SQL Server 2005)
s2sh博客项目,JSP采用JSTL,struts标签包含源码与程序截图,采用Junite进行单元测试,后台包含博文管理,博文分类管理,用户管理...扩展性良好,可自定义添加自己的模块(注:看hibernate映射文件就知道数据库的结构)
Tfile的Hibernate映射文件Tfile.hbm.xml放在Tfile .java类文件的相同目录下: 代码 2 领域对象映射文件 1. 2. !DOCTYPE hibernate-mapping PUBLIC 3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4. ...
ESho1.0版本主要实现项目的创建,数据库的创建与ORM映射. [创建项目与数据库] 1."电子商城系统"EShop应用项目的创建 2.MySQL数据库db_eshop的创建 3.为EShop应用导入Struts...13.配置购物车到商品的多对多单向关联关系
SSH2(Spring + Struts2 + Hibernate)是一个流行的Java Web开发框架组合,用于构建企业级Web应用程序。Spring作为轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架,提供了依赖注入和事务管理等核心功能;...
使用最新的ssh搭建起来的框架!希望对初学者有所帮助 hibernate映射文件,配置文件使用的是ant、xdoclet生成的!
java基于SSH框架的学生成绩管理系统源码。要求: (1) 整合Struts2、Spring和Hibernate框架 (2) 实现“登录”功能 (3) 实现“学生信息管理”功能 (4) 实现“学生成绩管理”功能 (5) 实现分页功能 目的...