需求:一个用户可以有多个角色,一个角色也可以被多个用户选择

POJO:

public class User {private Long user_id;private String user_code;private String user_name;private String user_password;private String user_state;//一个用户选择多个角色private Set<Role> roles = new HashSet<>();
}
public class Role {private Long role_id;private String role_name;private String role_memo;private Set<User> users = new HashSet<>();
}

对应的数据库表:user

CREATE TABLE `user` (`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',`user_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户账号',`user_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户名称',`user_password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户密码',`user_state` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '1:正常,0:暂停',PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

role

CREATE TABLE `role` (`role_id` bigint(32) NOT NULL AUTO_INCREMENT,`role_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '角色名称',`role_memo` varchar(128) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

中间表:user_role

CREATE TABLE `user_role` (`role_id` bigint(20) NOT NULL,`user_id` bigint(20) NOT NULL,PRIMARY KEY (`role_id`,`user_id`),KEY `user_id` (`user_id`),CONSTRAINT `user_role_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`),CONSTRAINT `user_role_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

user对应的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="com.bullet.domain.User" table="user"><!--建立类中的属性与表中的主键对应--><id name="user_id" column="user_id" ><generator class="native"/></id><!--建立类中的普通的属性和表的字段的对应--><property name="user_code" column="user_code" /><property name="user_name" column="user_name"/><property name="user_password" column="user_password"/><property name="user_state" column="user_state"/><!--配置多对多--><!--set:name  当前集合的名称   table  :多对多的中间表表名><key column  当前表的外键<many-to-many class="" column=""/>class:集合中对象的全路径column:集合中对象的外键--><set name="roles" table="user_role" cascade="save-update"><key column="user_id"></key><many-to-many class="com.bullet.domain.Role" column="role_id"/></set></class>
</hibernate-mapping>

role对应的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="com.bullet.domain.Role" table="role"><!--建立类中的属性与表中的主键对应--><id name="role_id" column="role_id" ><generator class="native"/></id><!--建立类中的普通的属性和表的字段的对应--><property name="role_name" column="role_name" /><property name="role_memo" column="role_memo"/><!--配置多对多--><!--set:name  当前集合的名称   table  :多对多的中间表表名><key column  当前表的外键<many-to-many class="" column=""/>class:集合中对象的全路径column:集合中对象的外键--><set name="users" table="user_role" inverse="true"><key column="role_id"></key><many-to-many class="com.bullet.domain.User" column="user_id"/></set></class>
</hibernate-mapping>

多对多的操作和一对多的操作几乎完全一致

(1)在配置关系时可以单向配置 ,也可以双向配置

唯一不同的是,多对多的双向配置一定要让一方放弃外键的维护权,否则会报错,原因是联系两张表的第三张表关系表,不能出现两条相同的记录。而一对多时双向配置可以双方都不放弃外键维护权,建议让一方放弃外键维护权是为了性能着想。

(2)保存时和一对多一样,可以双向保存,也可以单向保存,前提是单向保存时一定要设置级联保存

保存谁就在谁的配置文件中设置级联保存

(3)多对多的操作实质上是对集合的操作             注意:持久化对象设置属性会自动保存

需求:给用户1添加角色3

  public void test2(){//关系操作   实质是操作集合/*** 需求:给用户1添加角色3*/Session currentSession = HibernateUtil.getCurrentSession();Transaction transaction = currentSession.beginTransaction();//拿出角色和用户User user1 = currentSession.get(User.class, 9L);Role role3 = currentSession.get(Role.class, 8L);//添加关系user1.getRoles().add(role3);role3.getUsers().add(user1);//持久态对象设置属性可以直接自动保存transaction.commit();currentSession.close();}

需求:把用户2的角色3换成角色1

 public void test3(){Session currentSession = HibernateUtil.getCurrentSession();Transaction transaction = currentSession.beginTransaction();//把用户2的角色3改为角色1User user2 = currentSession.get(User.class, 10L);Role role3 = currentSession.get(Role.class, 8L);Role role1 = currentSession.get(Role.class, 6L);//删除用户2的角色3user2.getRoles().remove(role3);//给用户2添加角色1        持久化对象自动保存user2.getRoles().add(role1);transaction.commit();currentSession.close();}

Hibernate多对多关系配置相关推荐

  1. (经典)Hibernate多对一关系映射(四)

    多对一关系主要应用在添加,修改,列表上,删除功能用不到多对一关系.(实际开发中多对一的应用较多) 例:这里多加入一张新闻类型表,完成新闻的分类功能. 在新闻表中多加入一个分类的字段,表示该新闻属于某一 ...

  2. (经典)Hibernate多对多关系映射(五)

    多对多关系是产生在三张表的关系中的,必须有一张中间表,必须保证中间表只有两个字段,必须是复合主键,必须是另两张表的外键. 一.用多对多关系来设计类 例如:学生选课 这里只创建学生和课程类,中间表不生成 ...

  3. 6.Hibernate多对多关系建立

    多对多关系主要是应用在不同的用户具备多个不同的角色,比如王者荣耀中赵云既可以拿来打野又可以拿来打上单,李元芳既可以拿来打野也可以拿来打射手,因此这期间的多个用户具备多个角色属性用先前的一对多关系就不能 ...

  4. hibernate 多对多注解配置

    1.在公司一个员工对应多个部门,一个部门对应多个员工,因此部门与员工之间就是多对多的关系. Person类的代码如下: package com.mr.cheng.bean;import java.ut ...

  5. Hibernate 多对多关系实现

    2019独角兽企业重金招聘Python工程师标准>>> 一般情况下,多对多的关联关系是需要中间表的: 情况一:如果中间表仅仅是做关联用的,它里面仅有2个外键做联合主键,则使用Many ...

  6. hibernate的映射关系配置及对会话工厂的初始化。以及struts2写实例查询

    1.首先获取hibernate的jar导入,不写. 2.hibernate关键配置映射文件有两个,关键工具一个 分别是: 核心配置 hibernate.cfg.xml 持久化类对象与数据库映射配置*. ...

  7. Hibernate 学习心得1: 多对多关系中,中间表无法插入数据。

    Hibernate 学习心得之一 多对多关系中,中间表无法插入数据. 最近学习 spring4+hibernate4,学习中遇到了很多坑. 在这里我来说说我遇到的坑,这里就不介绍如何spring如何集 ...

  8. Hibernate多对多映射 - 连接表

    Hibernate多对多映射 - 连接表 今天我们将使用XML和注释配置来研究Hibernate多对多映射.之前我们看过如何在Hibernate中实现One To One和One To Many映射. ...

  9. 【Hibernate】hibernate实体关系映射——单边的多对多关系

    //刘梦冰发表于2015-6-19 单边的多对多关系 多对一.一对多的关系只需要两个表即可,使用子表的外键与主表的主键连接就能存储主从关系.而对多对多的关系至少需要三个表,其中两个表保存两个实体类,另 ...

最新文章

  1. jquery click 第一次没用_【通知】同济大学研究生会20202021学年第一次主席联席会...
  2. 06.SQLServer性能优化之---数据库级日记监控
  3. Pyramid Attention Network for Semantic Segmentation
  4. 纪中培训总结(2019年1月21~31日)
  5. python课后题答案第二章_Python编程:从入门到实践——练习题答案(第二章)
  6. Mysql主从占用大量cpu_Mysql占用过高CPU时的优化手段
  7. 何时使用 Golang
  8. 操作系统原理实验报告——读者写者
  9. 车辆模型-跟踪误差模型
  10. 简指南越狱的iOS及原因,负责其
  11. 中国地质大学英语语音学习笔记(六):英语连读——辅音连缀与爆破音读好,让连读更顺畅
  12. Android花样Text设置神器之SpanableString
  13. 计算机学院优秀主讲教师评选细则,重庆师范大学计算机学院教学优秀奖评选办法.doc...
  14. 安卓实现图片缩放平移的基本步骤
  15. 【C语言入门简单程序】三子棋——新手轻松学
  16. android开发相册代码,Android开发之简单的电子相册实现
  17. fowin自动交易和量化交易和合约交易
  18. 阿里云服务器不能发邮件的解决方法
  19. 资源受限的移动边缘计算系统中计算卸载问题研究
  20. 小米遭虚假评价后索赔 100 万元

热门文章

  1. react实现div隐藏_React 点击按钮显示div与隐藏div
  2. 亲测有效:局域网共享打印机出现,windows无法连接到打印机错误码0x0000011b
  3. 10.Windchill -- 客制化生命周期状态和角色
  4. 笔记本显示网络电缆被拔出怎么解决_我的电脑本地连接已连接但显示网络电缆被拔出是怎么回事啊...
  5. TOM企业邮箱|你会设置电子名片吗?
  6. 服务器的默认远程端口
  7. CCIE和HCIE工程师工资一般多少?
  8. 自然语言处理笔记6-哈工大 关毅
  9. vivado三人表决仿真
  10. 操作系统 管道及其实现