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

1.创建数据库表

sql语句如下

CREATE TABLE IF NOT EXISTS sys_user(user_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '用户id',user_code VARCHAR(32) DEFAULT NULL COMMENT '用户code值',user_name VARCHAR(32) DEFAULT NULL COMMENT '用户名',user_password VARCHAR(32) DEFAULT NULL COMMENT '用户名密码',user_state VARCHAR(32) DEFAULT NULL COMMENT '用户职位'
);CREATE TABLE IF NOT EXISTS sys_role(role_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '职位id',role_name VARCHAR(32) DEFAULT NULL COMMENT '职位名称',role_memo VARCHAR(32) DEFAULT NULL COMMENT '职位成员'
);CREATE TABLE IF NOT EXISTS sys_user_role(user_id BIGINT NOT NULL ,FOREIGN KEY(user_id) REFERENCES sys_user(user_id) ON DELETE  NO ACTION ON UPDATE NO ACTION ,role_id BIGINT NOT NULL ,FOREIGN KEY (role_id) REFERENCES sys_role(role_id) ON DELETE NO ACTION ON UPDATE NO ACTION
);
复制代码

2.创建实体

创建Sys_user实体

package com.classes;import java.util.HashSet;
import java.util.Set;public class Sys_user {private Long user_id;private String user_code;private String user_name;private String user_password;private String user_state;private Set<Sys_role> roles  = new HashSet<Sys_role>();public Set<Sys_role> getRoles() {return roles;}public void setRoles(Set<Sys_role> roles) {this.roles = roles;}public Long getUser_id() {return user_id;}public void setUser_id(Long user_id) {this.user_id = user_id;}public String getUser_code() {return user_code;}public void setUser_code(String user_code) {this.user_code = user_code;}public String getUser_name() {return user_name;}public void setUser_name(String user_name) {this.user_name = user_name;}public String getUser_password() {return user_password;}public void setUser_password(String user_password) {this.user_password = user_password;}public String getUser_state() {return user_state;}public void setUser_state(String user_state) {this.user_state = user_state;}
}
复制代码

创建Sys_role实体

package com.classes;import java.util.HashSet;
import java.util.Set;public class Sys_role {private Long role_id;private String role_name;private String role_memo;private Set<Sys_user>users = new HashSet<Sys_user>();public Set<Sys_user> getUsers() {return users;}public void setUsers(Set<Sys_user> users) {this.users = users;}public Long getRole_id() {return role_id;}public void setRole_id(Long role_id) {this.role_id = role_id;}public String getRole_name() {return role_name;}public void setRole_name(String role_name) {this.role_name = role_name;}public String getRole_memo() {return role_memo;}public void setRole_memo(String role_memo) {this.role_memo = role_memo;}
}
复制代码

3.创建映射文件

用工具创建Sys_user的映射表,创建完毕需要对原有多对多的地方进行修改

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Mar 6, 2018 4:29:51 PM by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.classes.Sys_user" table="SYS_USER"><id name="user_id" type="java.lang.Long"><column name="USER_ID" /><generator class="native" /></id><property name="user_code" type="java.lang.String"><column name="USER_CODE" /></property><property name="user_name" type="java.lang.String"><column name="USER_NAME" /></property><property name="user_password" type="java.lang.String"><column name="USER_PASSWORD" /></property><property name="user_state" type="java.lang.String"><column name="USER_STATE" /></property><set name="roles" table="sys_user_role" inverse="false" lazy="true"><key><column name="USER_ID" /></key><!-- <one-to-many class="com.classes.Sys_role" /> --><many-to-many class="com.classes.Sys_role" column="role_id"/></set></class>
</hibernate-mapping>
复制代码

用工具创建Sys_role映射表,需要对多对多的地方进行修改成如下的代码

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Mar 6, 2018 4:29:51 PM by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.classes.Sys_role" table="SYS_ROLE"><id name="role_id" type="java.lang.Long"><column name="ROLE_ID" /><generator class="native" /></id><property name="role_name" type="java.lang.String"><column name="ROLE_NAME" /></property><property name="role_memo" type="java.lang.String"><column name="ROLE_MEMO" /></property><set name="users" table="sys_user_role" inverse="false" lazy="true"><key><column name="ROLE_ID" /></key><!--  <one-to-many class="com.classes.Sys_user" /> --><many-to-many class="com.classes.Sys_user" column="user_id"/></set></class>
</hibernate-mapping>
复制代码

4.在核心配置文件中添加入映射文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.password">lwhong1017</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myblog?useSSL=true</property><property name="hibernate.connection.username">root</property><mapping resource="com/classes/Sys_role.hbm.xml"/><mapping resource="com/classes/Sys_user.hbm.xml"/></session-factory>
</hibernate-configuration>
复制代码

5.引入封装的数据工具以及编写测试代码

5.1数据工具
package com.HibernateUtils;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;import com.classes.Sys_role;
import com.classes.Sys_user;public class DButils {private static SessionFactory sessionFactory;private static Session session;public static Session getSession() {return session;}public static void setSession(Session session) {DButils.session = session;}static {Configuration configuration = new Configuration().configure();sessionFactory = configuration.buildSessionFactory();}static {session = sessionFactory.openSession();}public void SaveData() {System.out.println("aaaaa----");Session session = this.getSession();Transaction transaction = session.beginTransaction();// 1.创建用户Sys_user user1 = new Sys_user();user1.setUser_name("赵云");Sys_user user2 = new Sys_user();user2.setUser_name("马克");Sys_user user3 = new Sys_user();user3.setUser_name("干将莫邪");// 2.创建角色职位Sys_role role1 = new Sys_role();role1.setRole_name("ADC射手");Sys_role role2 = new Sys_role();role2.setRole_name("打野");Sys_role role3 = new Sys_role();role3.setRole_name("中单");Sys_role role4 = new Sys_role();role4.setRole_name("战士");user1.getRoles().add(role2);user1.getRoles().add(role4);user2.getRoles().add(role3);user2.getRoles().add(role2);user3.getRoles().add(role3);session.save(user1);session.save(user2);session.save(user3);session.save(role1);session.save(role2);session.save(role3);session.save(role4);transaction.commit();System.out.println("bbbbb----");}
}
复制代码
5.2测试类
package com.testHibernate;import com.HibernateUtils.DButils;public class testHib {public static void main(String[] args) {// TODO Auto-generated method stubDButils dButils = new DButils();dButils.SaveData();}}
复制代码

因为有前面出现的一些坑本篇也出线了一些坑但是按照先前的一些思路还是比较顺利的解决了,多对多的主要是在hbm配置时候需要column对应各个属性 WiHongNoteBook

转载于:https://juejin.im/post/5c27323ef265da61561f5811

6.Hibernate多对多关系建立相关推荐

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

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

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

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

  3. Hibernate多对多关系配置

    需求:一个用户可以有多个角色,一个角色也可以被多个用户选择 POJO: public class User {private Long user_id;private String user_code ...

  4. Hibernate 多对多关系实现

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

  5. 六、hibernate表与表之间的关系(多对多关系)

    多对多关系 创建实体类和对应映射文件 Student.java 1 package com.qf.entity; 2 3 import java.util.HashSet; 4 import java ...

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

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

  7. Hibernate从零开始_07_多对多关系(中间表)

    1.Hibernate多对多(中间表含多个字段)的把多对多拆分为两个一对多.实现如下: 学生类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

  8. Hibernate入门之关系篇:多对一和一对多映射

    关联关系映射,是对象映射关系中相对复杂的一种,但也是用处最多的一种,因为数据中的表不可能都是单独存在,彼此之间必定存在千丝万缕的联系,这也是关系型数据库的特征所在.同样关联关系的映射,也是对象关系映射 ...

  9. navicat 8 mysql生成关系_MySQL数据库通过navicat建立多对多关系

    ** 构建两张表的多对多关系:清洗数据表(clean_data表)与用户表(user表)建立多对多的关系.如下图图0所示 图0 多对多之间关系 1 创建表 .打开navicat,创建三张表,clean ...

最新文章

  1. javascript数组集锦
  2. OPPO R9s在哪里开启Usb调试模式的完美步骤
  3. mp4转gif_mp4转gif怎么转?一键转码的技巧要知道
  4. 【CTR预估】CTR模型如何加入稠密连续型和序列型特征?
  5. 关于小程序授权地理位置(wx.getLocation + 用户体验)
  6. Redis应用案例 查找某个值的范围
  7. java new file会创建文件吗_Java高级——文件与I/O流
  8. MFC资源切换(AFX_MANAGE_STATE)简介
  9. linux zmq编译pgm,czmq交叉编译
  10. 解决conda install速度慢
  11. MSN登陆以后没有响应处理方法
  12. 用单片机控制直流电机
  13. SHELL脚本学习指南--学习心得20110924
  14. 运动控制器的自定义G代码编程应用
  15. BREW:3G移动增值服务的黎明(转)
  16. Docker升级Wekan
  17. 计算机视觉城市排名,计算机视觉技术量化城市变迁
  18. linux系统设置密钥登录
  19. 前端必会的 HTML+CSS 常用技巧 之 虚线的实现方式
  20. 教你用Python绘制3D地图,做出来效果太酷炫啦~

热门文章

  1. Ubuntu(Debian)apt-get
  2. CAS 单点登录模块学习
  3. 使用接口更改已装箱的值类型中的字段
  4. json日期格式问题的办法
  5. 置顶信息[置顶] 常用日常英语缩写
  6. 【Cocos2D-X 】初窥门径(9)播放音乐/音效
  7. 【算法导论第13章】红黑树
  8. 程序员喝酒文化 (转贴)
  9. XP-SP3 安装之后怎么禁止更新
  10. 使用supervisor提高nodejs调试效率