hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接。
本系列将介绍Hibernate中主要的几种关联映射
Hibernate一对一主键单向关联
Hibernate一对一主键双向关联
Hibernate一对一外键单向关联
Hibernate一对一外键双向关联
Hibernate多对一单向关联
Hibernate多对一双向关联
Hibernate多对多关联
代码都写有注释,主要包括(核心配置文件,实体映射文件,实体类,测试类,数据库)主要操作有增删改查。
本篇主要介绍Hibernate多对多关联:
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 配置数据库连接驱动类 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 配置数据库连接字符串 --> <property name="connection.url"><![CDATA[jdbc:mysql://localhost:3306/test111?useUnicode=true&characterEncoding=utf8]]></property> <!-- 配置数据库连接用户名 --> <property name="connection.username">root</property> <!-- 配置数据库连接密码 --> <property name="connection.password">123456</property> <!-- 配置数据库方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 配置数据库表生成策略 --> <!--<property name="hibernate.hbm2ddl.auto">update</property> --> <!-- 配置是否打印显示SQL语句 --> <property name="show_sql">true</property> <!-- 配置是否格式化显示SQL语句 --> <property name="format_sql">true</property> <!-- 配置hibernate是否自动提交事务 --> <!--<property name="hibernate.connection.autocommit">true</property> --> <!--多对多关联 --> <mapping resource="com/great/entity6/User.hbm.xml"></mapping> <mapping resource="com/great/entity6/Role.hbm.xml"></mapping> </session-factory> </hibernate-configuration>
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.great.entity6"> <class name="User" table="user1"> <id name="id" column="id" type="int"> <generator class="native"> </generator> </id> <property name="name" column="name" type="string"></property> <set name="roles" table="mapping1"> <key column="user_id"></key> <many-to-many class="com.great.entity6.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.great.entity6"> <class name="Role" table="role1"> <id name="id" column="id" type="int"> <generator class="native"> </generator> </id> <property name="roleName" column="roleName" type="string"></property> <set name="users" table="mapping1"> <key column="role_id"></key> <many-to-many class="com.great.entity6.User" column="user_id"></many-to-many> </set> </class> </hibernate-mapping>
User.java
package com.great.entity6; import java.util.Set; public class User { private int id; private String name; private Set<Role> 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<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } }
Role.java
package com.great.entity6; import java.util.Set; public class Role { private int id; private String roleName; private Set<User> users; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } public Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this.users = users; } }
TestManyToMany.java
package com.great.test; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import com.great.entity6.Role; import com.great.entity6.User; public class TestManyToMany { static Session session; // 多表对多表关联 @BeforeClass public static void setUpBeforeClass() throws Exception { // 加载hibernate主配置文件 Configuration cfg = new Configuration().configure(); // 构建session工厂 SessionFactory sf = cfg.buildSessionFactory(); // 打开session session = sf.openSession(); } @AfterClass public static void tearDownAfterClass() throws Exception { // 关闭session,释放资源 session.close(); } // select1 ,通过User查询数据 @Test public void testManyToManySelect1() { User user = (User) session.get(User.class, 1); System.out.println("用户姓名是:" + user.getName()); System.out.println("用户的权限有:"); Set<Role> roles = user.getRoles(); Iterator<Role> it = roles.iterator(); while (it.hasNext()) { System.out.print(it.next().getRoleName() + " "); } } // select2 ,通过Role查询数据 @Test public void testManyToManySelect2() { Role role = (Role) session.get(Role.class, 1); System.out.println("权限名称为:" + role.getRoleName()); System.out.println("拥有此权限的人有:"); Set<User> users = role.getUsers(); Iterator<User> it = users.iterator(); while (it.hasNext()) { System.out.print(it.next().getName() + " "); } } /* * insert1,通过User插入数据 [发出七条语句,insert role1,insert role2,insert user,insert * mapping1 2条,role1表中保存2条数据,user1表中保存1条数据,mapping1表中保存2条数据] */ @Test public void testManyToManySave1() { Transaction ts = session.beginTransaction(); User user = new User(); user.setName("王小胖"); Role role1 = new Role(); role1.setRoleName("删帖权限1"); Role role2 = new Role(); role2.setRoleName("管理员权限2"); Set<Role> roles = new HashSet<Role>(); Set<User> user1 = new HashSet<User>(); Set<User> user2 = new HashSet<User>(); roles.add(role1); roles.add(role2); user1.add(user); user2.add(user); user.setRoles(roles);// 和save2区别的地方 session.save(role1); session.save(role2); session.save(user); ts.commit(); } /* * insert2,通过Role插入数据 [发出七条语句,insert role1,insert role2,insert user,insert * mapping1 2条,role1表中保存2条数据,user1表中保存1条数据,mapping1表中保存2条数据] */ @Test public void testManyToManySave2() { Transaction ts = session.beginTransaction(); User user = new User(); user.setName("王6胖"); Role role1 = new Role(); role1.setRoleName("删帖权限44"); Role role2 = new Role(); role2.setRoleName("管理员权限44"); Set<Role> roles = new HashSet<Role>(); Set<User> user1 = new HashSet<User>(); Set<User> user2 = new HashSet<User>(); roles.add(role1); roles.add(role2); user1.add(user); user2.add(user); role1.setUsers(user1);// 和save1区别的地方 role2.setUsers(user2); session.save(role1); session.save(role2); ts.commit(); } /* * delete1,通过User删除用户数据,通过发出一条select语句,两条delete语句,先delete mapping1,再delete * user1。 */ @Test public void testManyToManyDelete1() { Transaction ts = session.beginTransaction(); User user = (User) session.get(User.class, 8); session.delete(user); ts.commit(); } /* * delete2,通过Role删除权限数据,通过发出一条select语句,两条delete语句,先delete mapping1,再delete * role1。 */ @Test public void testManyToManyDelete2() { Transaction ts = session.beginTransaction(); Role role = (Role) session.get(Role.class, 5); session.delete(role); ts.commit(); } /* update1,通过User更新用户数据,添加权限, update user1,insert mapping1 */ @Test public void testManyToManyUpdate1() { Transaction ts = session.beginTransaction(); User user = (User) session.get(User.class, 4); user.setName("张二"); // 获得权限 Role role = (Role) session.get(Role.class, 1); Set<Role> roles = user.getRoles(); roles.add(role); user.setRoles(roles); session.save(user); ts.commit(); } /* update2,通过Role更新权限,添加此权限的拥有者, update role1,insert mapping1 */ @Test public void testManyToManyUpdate2() { Transaction ts = session.beginTransaction(); User user = (User) session.get(User.class, 4); // 获得权限 Role role = (Role) session.get(Role.class, 2); role.setRoleName("系统权限"); Set<User> users = role.getUsers(); users.add(user); role.setUsers(users); session.save(role); ts.commit(); } }
数据库:
user1表
两个字段:id name
mapping1表
三个字段:id user_id role_id
role1表
两个字段: id roleName
注意:在mapping表上建立两个外键关系,user_id和role_id。
hibernate多对多关联映射的更多相关文章
- Hibernate多对多关联映射的HQL中的in条件查询问题
群里有朋友求解一个问题,高分求一条HQL多对多查询语句 . 问题描述见 http://topic.csdn.net/u/20090621/16/4eac6fe0-bf3e-422e-a697-f758 ...
- Hibernate 多对多关联映射, 中间表加查询条件
package com.coracle.yk.xpo.po.base; import java.util.Date; import java.util.HashSet; import java.uti ...
- hibernate的多对多关联映射
在我们实际项目中,多对多的情况也时长存在,比如最常见的就是系统管理的五张表,如下面的一个结构: 在本文学习hibernate多对多关联映射的实验中我简单的写几个字段,达到学习目的即可. 1.多对多的关 ...
- 【Hibernate框架】关联映射(一对多,多对一)
根据我们的总结计划,上篇文章我们总结了有关于一对一映射相关知识,接下来,我们进行下一个阶段,一对多.多对一映射相关知识. 场景设定: 国家规定,一个人只能在一个公司上班,一个公司可以拥有很多员工.我们 ...
- (Hibernate进阶)Hibernate映射——多对多关联映射(八)
多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...
- Hibernate(六)——多对多关联映射
前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...
- hibernate之关于使用连接表实现多对一关联映射
[Hibernate]之关于使用连接表实现多对一关联映射 在我们项目使用中採用中间表最多的一般就是多对一,或者是多对多,当然一对一使用中间表也是能够的,可是这样的几率通常少之又少!所以这里重点介绍多对 ...
- 一口一口吃掉Hibernate(六)——多对多关联映射
今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就 ...
- 【SSH系列】Hibernate映射 -- 多对多关联映射
映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...
随机推荐
- B树——算法导论(25)
B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
- 从I/O复用谈epoll为什么高效
上一篇文章中,谈了一些网络编程的基本概念.在现实使用中,用的最多的就是I/O复用了,无非就是select,poll,epoll 很多人提到网络就说epoll,认为epoll效率是最高的.单纯的这么认为 ...
- 自己来实现一个简易的OCR
来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人 ...
- jQuery遮罩层登录对话框
用户登录是许多网站必备的功能.有一种方式就是不管在网站的哪个页面,点击登录按钮就会弹出一个遮罩层,显示用户登录的对话框.这用方式比较灵活方便.而现在扫描二维码登录的方式也是很常见,例如QQ.微信.百度 ...
- 信息安全-5:RSA算法详解(已编程实现)[原创]
转发注明出处:http://www.cnblogs.com/0zcl/p/6120389.html 背景介绍 1976年以前,所有的加密方法都是同一种模式: (1)甲方选择某一种加密规则,对信息进行加 ...
- 如何使用dos命令查看MySQL当前使用的数据库?
1.dos命令安装mysqld --stall.启动net start mysql.进入MySQL数据库mysql -uroot -p后,输入select database(); 如图:
- SQLServer2005创建定时作业任务
SQLServer定时作业任务:即数据库自动按照定时执行的作业任务,具有周期性不需要人工干预的特点 创建步骤:(使用最高权限的账户登录--sa) 一.启动SQL Server代理(SQL Server ...
- linux的top命令参数详解
简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...
- Enterprise Integration Pattern - 组成简介
近些年来,越来越多的Web应用正在逐渐向大型化的方向发展.它们通常都会包含一系列相互协作的子服务.在开发过程中,如何让这些子服务协同工作常常是软件开发人员所最为头疼的问题,如各个子服务之间的数据表示不 ...