hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例

hibernate_day03_一对多相关操作

Hibernate多对多关系的配置 :

(1)创建表 :

用户表 【crm_sys_user.sql】:

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

角色表 【crm_sys_role.sql】:

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

中间表 【crm_sys_user_role.sql】:

CREATE TABLE `sys_user_role` (`role_id` bigint(32) NOT NULL COMMENT '角色id',`user_id` bigint(32) NOT NULL COMMENT '用户id',PRIMARY KEY (`role_id`,`user_id`),KEY `FK_user_role_user_id` (`user_id`),
/*创建两个外键 分别指向 sys_user 、sys_role表的主键*/CONSTRAINT `FK_user_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,CONSTRAINT `FK_user_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(2)创建实体 :

User.java :

package com.itheima.hibernate.domain;import java.util.HashSet;
import java.util.Set;/*** 用户的实体*CREATE TABLE `sys_user` (`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',`user_code` varchar(32) NOT NULL COMMENT '用户账号',`user_name` varchar(64) NOT NULL COMMENT '用户名称',`user_password` varchar(32) NOT NULL COMMENT '用户密码',`user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;*/
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<Role>();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;}public Set<Role> getRoles() {return roles;}public void setRoles(Set<Role> roles) {this.roles = roles;}}

Role.java :

package com.itheima.hibernate.domain;import java.util.HashSet;
import java.util.Set;/*** 角色的实体*CREATE TABLE `sys_role` (`role_id` bigint(32) NOT NULL AUTO_INCREMENT,`role_name` varchar(32) NOT NULL COMMENT '角色名称',`role_memo` varchar(128) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;*/
public class Role {private Long role_id;private String role_name;private String role_memo;// 一个角色被多个用户选择:// 放置的是用户的集合private Set<User> users = new HashSet<User>();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;}public Set<User> getUsers() {return users;}public void setUsers(Set<User> users) {this.users = users;}}

(3)创建映射 :

hibernate.cfg.xml【核心配置文件】 :

<?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.url">jdbc:mysql:///hibernate_day03</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">lwx</property><!-- 配置Hibernate的方言 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 可选配置================ --><!-- 打印SQL --><property name="hibernate.show_sql">true</property><!-- 格式化SQL --><property name="hibernate.format_sql">true</property><!-- 自动创建表 create --><property name="hibernate.hbm2ddl.auto">create</property><!-- 配置C3P0连接池 --><property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property><!--在连接池中可用的数据库连接的最少数目 --><property name="c3p0.min_size">5</property><!--在连接池中所有数据库连接的最大数目  --><property name="c3p0.max_size">20</property><!--设定数据库连接的过期时间,以秒为单位,如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 --><property name="c3p0.timeout">120</property><!--每3000秒检查所有连接池中的空闲连接 以秒为单位--><property name="c3p0.idle_test_period">3000</property><!-- 设置事务隔离级别 --><property name="hibernate.connection.isolation">4</property><!-- 配置当前线程绑定的Session --><property name="hibernate.current_session_context_class">thread</property><!-- 引入映射 --><!-- <mapping resource="com/itheima/hibernate/domain/Customer.hbm.xml"/><mapping resource="com/itheima/hibernate/domain/LinkMan.hbm.xml"/> --><mapping resource="com/itheima/hibernate/domain/User.hbm.xml"/><mapping resource="com/itheima/hibernate/domain/Role.hbm.xml"/></session-factory>
</hibernate-configuration>

log4j.properties【日志文件】 :

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ###
# error warn info debug trace
log4j.rootLogger= info, stdout

User.hbm.xml 【用户的映射】 :

<?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.itheima.hibernate.domain.User" table="sys_user"><!-- 建立OID与主键的映射 --><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  :多对多的关系需要使用中间表,放的是中间表的名称。--><!--  cascade="save-update,delete"   --><set name="roles" table="sys_user_role"><!-- key标签* column:当前的对象对应中间表的外键的名称。中间表:两个属性[同时是主键\外键。]--><key column="user_id"/><!-- many-to-many标签:* class   :对方的类的全路径* column:对方的对象在中间表中的外键的名称。--><many-to-many class="com.itheima.hibernate.domain.Role" column="role_id"/></set></class>
</hibernate-mapping>

Role.hbm.xml 【角色的映射】 :

<?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.itheima.hibernate.domain.Role" table="sys_role"><!-- 建立OID与主键的映射 --><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      :多对多的关系需要使用中间表,放的是中间表的名称。--><set name="users" table="sys_user_role" cascade="save-update,delete" inverse="true"><!-- key标签:* column    :当前的对象对应中间表的外键的名称。--><key column="role_id"/><!-- many-to-many标签:* class        :对方的类的全路径* column    :对方的对象在中间表中的外键的名称。--><many-to-many class="com.itheima.hibernate.domain.User" column="user_id"/></set></class>
</hibernate-mapping>

(4)编写测试类:

HibernateDemo2.java :

package com.itheima.hibernate.demo2;import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;import com.itheima.hibernate.domain.Role;
import com.itheima.hibernate.domain.User;
import com.itheima.hibernate.utils.HibernateUtils;/*** Hibernate的多对多的映射**/
public class HibernateDemo2 {@Test/**保存多条记录:保存多个用户和角色 */public void demo1(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 创建2个用户User user1 = new User();user1.setUser_name("zhaohong");User user2 = new User();user2.setUser_name("libing");// 创建3个角色Role role1 = new Role();role1.setRole_name("yanfabu");Role role2 = new Role();role2.setRole_name("shichangbu");Role role3 = new Role();role3.setRole_name("gongguangbu");// 设置双向的关联关系:user1.getRoles().add(role1);user1.getRoles().add(role2);user2.getRoles().add(role2);user2.getRoles().add(role3);role1.getUsers().add(user1);role2.getUsers().add(user1);role2.getUsers().add(user2);role3.getUsers().add(user2);// 保存操作:多对多建立了双向的关系,必须有一方放弃外键维护。// 要不然 报错[ 主键重复 ]  设置inverse="true"可不报错// 一般是被动方放弃外键维护权。session.save(user1);session.save(user2);session.save(role1);session.save(role2);session.save(role3);tx.commit();}@Test/*** 多对多的操作:* * 只保存一边是否可以?不可以,瞬时对象异常*/public void demo2(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 创建2个用户User user1 = new User();user1.setUser_name("zhaohong");// 创建3个角色Role role1 = new Role();role1.setRole_name("yanfabu");// 设置双向的关联关系:user1.getRoles().add(role1);role1.getUsers().add(user1);// 只保存用户:// session.save(user1);session.save(role1);tx.commit();}@Test/*** 多对多的级联保存:* * 保存用户级联保存角色。在用户的映射文件中配置。* * 在User.hbm.xml中的set上配置 cascade="save-update"*/public void demo3(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 创建2个用户User user1 = new User();user1.setUser_name("zhaohong");// 创建3个角色Role role1 = new Role();role1.setRole_name("yanfabu");// 设置双向的关联关系:user1.getRoles().add(role1);role1.getUsers().add(user1);// 只保存用户:session.save(user1);tx.commit();}/*** 多对多的级联保存:* * 保存角色级联保存用户。在角色的映射文件中配置。* * 在Role.hbm.xml中的set上配置 cascade="save-update"*/@Testpublic void demo4(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 创建2个用户User user1 = new User();user1.setUser_name("libing");// 创建3个角色Role role1 = new Role();role1.setRole_name("gonganbu");// 设置双向的关联关系:user1.getRoles().add(role1);role1.getUsers().add(user1);// 只保存用户:session.save(role1);tx.commit();}/*** 多对多的级联删除:* * 删除用户级联删除角色* * 在User.hbm.xml中的set上配置 cascade="delete"*/@Testpublic void demo5(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();//级联删除,先查询// 查询1号用户:User user  = session.get(User.class, 1l);session.delete(user);tx.commit();}/*** 多对多的级联删除:* * 删除角色级联删除用户* * 在Role.hbm.xml中的set上配置 cascade="delete"*/@Testpublic void demo6(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 查询2号角色:Role role  = session.get(Role.class, 2l);session.delete(role);tx.commit();}@Test/*** 给用户选择角色*/public void demo7(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 给1号用户多选2号角色// 查询1号用户User user  = session.get(User.class, 1l);// 查询2号角色Role role = session.get(Role.class, 2l);user.getRoles().add(role);tx.commit();}@Test/*** 给用户改选角色*/public void demo8(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 给2号用户将原有的2号角色改为3号角色// 查询2号用户User user  = session.get(User.class, 2l);// 查询2号角色Role role2 = session.get(Role.class, 2l);Role role3 = session.get(Role.class, 3l);user.getRoles().remove(role2);user.getRoles().add(role3);tx.commit();}@Test/*** 给用户改选角色*/public void demo9(){Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 给2号用户删除1号角色// 查询2号用户User user  = session.get(User.class, 2l);// 查询2号角色Role role = session.get(Role.class, 1l);user.getRoles().remove(role);tx.commit();}
}

hibernate_day03_多对多关联映射相关推荐

  1. NHibernate从入门到精通系列(7)——多对一关联映射

    内容摘要 多对一关联映射概括 多对一关联映射插入和查询 多对一关联映配置介绍 一.多对一关联映射概括 关联关系是实体类与实体类之间的结构关系,分别为"多对一"."一对一& ...

  2. hibernate之多对多关联映射

    hibernate之多对多关联映射 转载于:https://www.cnblogs.com/liuyang-1037/archive/2009/06/06/1497589.html

  3. 步步为营Hibernate全攻略(三)剪不断理还乱之:多对多关联映射

    hibernate多对多关联映射同样可以分为单向的关联映射和双向的关联映射,与一对多关联映射相比,双方之间的关系将不再由其中多的一方维护而是变成了由第三张表来维护.第三张表的出现不仅减少了两张表中的数 ...

  4. mybatis手写多对多关联映射

    mybatis手写多对多关联映射 1.一对一关联查询 1.1resultType实现 1.2resultMap实现 2.一对多关联查询 3.多对多关联查询 4.resultType与resultMap ...

  5. 多对多关联映射(双向)

    关联映射方面的最后一篇了,我觉得映射文件的编写是使用hibernate的基础,而关联映射又是基础的基础,所以这方面分的细一些,罗嗦一些,说明白就好,呵呵. 多对多关联(双向),相对单向,在实体上就是一 ...

  6. JAVA两个表相关联_关于Java:如何将多对多关联映射到映射到两个不同表的类?...

    我有一个凭证-POJO映射到两个表. 第一个映射分配一个实体名称" voucherA",并将POJO映射到TableA. 第二个映射使用" voucherB"作 ...

  7. 【Hibernate框架】关联映射(多对多关联映射)

    按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...

  8. MyBatis 多对多关联映射

    示例[通过班级查询老师信息] 创建t_classes 创建t_classessTeacher 创建t_teacher 创建Classes package com.po; import java.uti ...

  9. NHibernate多对多关联映射的实现

    上次用EF演示了数据库多对多关系的操作,这次我们还是引用上次的案例,来演示如何在C#当中使用NHibernate. 首先介绍一下NHibernate框架的来源.熟悉Java编程的读者肯定知道Hiber ...

最新文章

  1. 程序员的朋友圈应该是这样的。。。
  2. 生日游戏html,小朋友过生日室内游戏
  3. 干货丨最全技术图谱:一文掌握人工智能各大分支技术(经典好文,值得收藏)
  4. c++ 重载 重写_关于C/C++中的++i和i++实现机制的探讨
  5. 告诉你银行在年底为存储做的小动作
  6. 一次非常有意思的SQL优化经历:从30248.271s到0.001s
  7. 问题通用解决方法探索
  8. 归并排序的java语言_归并排序 java语言
  9. Linux 下 Weblogic 的安装 、配置以及发布
  10. 计算机二级科目有ps吗,计算机二级有ps吗
  11. MVC 中 Html.RenderPartial()与Html.Partial()区别
  12. MPPT算法(恒定电压、扰动观察、电导增量)介绍与实现过程
  13. Protel常用封装库
  14. 相关系数(Correlation coefficient)
  15. Ubuntu 如何更新软件源(阿里源、华为源、清华源等)
  16. 快收藏ReactOS 新手指南
  17. 就是美女,怎么了!!!
  18. 微信第三方平台之代开发小程序(二)
  19. Teach yourself Programing in Ten Years(翻译+原文链接)
  20. google浏览器打开axure原型的插件

热门文章

  1. matlab 多个波段,MatLab读取ENVI图像统计多波段图像信息
  2. pythondir什么意思_Python之dir()与__dict__的区别
  3. mysql order by newid_order by newid() 随机查询
  4. 八、Flume的构架,安装和基本使用
  5. NeurIPS 2020 | 一种基于动作采样的简单高效的正则化强化学习方法
  6. 今晚直播 | 高效视频理解模型的设计及ICCV比赛冠军方案解读
  7. Numpy-创建数组
  8. 安装service_identity失败总结
  9. hadoop 启动提示输入password的问题
  10. photon四种同步方式_【Linux】多线程同步的四种方式