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,多对多关联,无论 ...
随机推荐
- 微信小程序开发心得
微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...
- 踩石行动:ViewPager无限轮播的坑
2016-6-19 前言 View轮播效果在app中很常见,一想到左右滑动的效果就很容易想到使用ViewPager来实现.对于像我们常说的banner这样的效果,具备无限滑动的功能是可以用ViewPa ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(上)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- 01.LoT.UI 前后台通用框架分解系列之——小图片背景全屏显示(可自动切换背景)
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- junit4进行单元测试
一.前言 提供服务的时候,为了保证服务的正确性,有时候需要编写测试类验证其正确性和可用性.以前的做法都是自己简单写一个控制层,然后在控制层里调用服务并测试,这样做虽然能够达到测试的目的,但是太不专业了 ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
- node中子进程同步输出
管道 通过"child_process"模块fork出来的子进程都是返回一个ChildProcess对象实例,ChildProcess类比较特殊无法手动创建该对象实例,只能使用fo ...
- 就这么漂来漂去---一个毕业三个月的java程序员的裸辞风波
注:这并不是一篇技术文章,而是记录了我这几个月经历的入职,裸辞,找工作的心路历程,简单介绍一个博主的情况,我是16年毕业生,校招进了一家北京的公司,java开发,和很多年轻人一样,干了一段时间,我发现 ...
- ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件
作者: Rick Anderson 翻译: 娄宇(Lyrics) 校对: 高嵩 章节: 介绍视图组件 创建视图组件 调用视图组件 演练:创建一个简单的视图组件 附加的资源 查看或下载示例代码 介绍视图 ...
- SharePoint 2016 入门视频教程
之前一直有朋友让自己录一些SharePoint的入门视频,之前没有太多时间,一个巧合的机会收到CSDN学院的邮件,可以在CSDN上发布视频教程,自己就录了一些.说起录视频也是蛮辛苦的,每天下班吃完饭要 ...