1、由问题引出一个多对多拆分成两个多对一

问题:Hibernate 关联映射 之 多对多 关联(一)中中间表只是一个存放用户和角色的表,并无其他作用,如果客户有其他的需求,该表就无法扩展。

2、问题解决过程:

用户、角色 之间的关系拆分成用户和用户角色、角色和用户角色的关系,即:两个多对一的关系。

小技巧:如何去判断多对一还是一对多对象,要从对象的角度来看,即:从一个对象的角度去看另一个对象。

用户:

[java] view plain copy print?
  1. public class User {
  2. private int id;
  3. private String name;
  4. private String password;
  5. private Set<UserRole> roles;

用户配置文件:

[html] view plain copy print?
  1. <hibernate-mapping>
  2. <class name="com.shangxuetang.User" table="t_user">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="name"></property>
  7. <property name="password"></property>
  8. <set name="roles">
  9. <key column="userID"></key>
  10. <one-to-many class="com.shangxuetang.UserRole"/>
  11. </set>
  12. </class>
  13. </hibernate-mapping>

角色:

[java] view plain copy print?
  1. public class Role {
  2. private int id;
  3. private String name;
  4. private Set<UserRole> users;

角色配置文件:

[html] view plain copy print?
  1. <hibernate-mapping>
  2. <class name="com.shangxuetang.Role" table="t_role">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="name"></property>
  7. <set name="users">
  8. <key column="roleID"></key>
  9. <one-to-many class="com.shangxuetang.UserRole"/>
  10. </set>
  11. </class>
  12. </hibernate-mapping>

用户角色:

[java] view plain copy print?
  1. public class UserRole {
  2. private int id;
  3. private User user;
  4. private Role role;
  5. private Date assignTime;
  6. public UserRole() {}
  7. public UserRole(User u,Role r) {
  8. this.user = u;
  9. this.role = r;
  10. this.assignTime = new Date();
  11. }

用户角色配置文件:

[html] view plain copy print?
  1. <hibernate-mapping>
  2. <class name="com.shangxuetang.UserRole" table="t_userrole">
  3. <id name="id">
  4. <generator class="native"/>
  5. </id>
  6. <property name="assignTime" type="date"></property>
  7. <many-to-one name="user" column="userID"></many-to-one>
  8. <many-to-one name="role" column="roleID"></many-to-one>
  9. </class>
  10. </hibernate-mapping>

测试示例代码:

[java] view plain copy print?
  1. public void  testManytoManyChaiFen() {
  2. Session session = HibernateUtil.getSession();
  3. try {
  4. session.beginTransaction();
  5. User u1 = new User("zhangsan");
  6. session.save(u1);
  7. User u2 = new User("lisi");
  8. session.save(u2);
  9. Role r1 = new Role("adminstor");
  10. session.save(r1);
  11. Role r2 = new Role("usualuser");
  12. session.save(r2);
  13. Role r3 = new Role("VIPuser");
  14. session.save(r3);
  15. UserRole ur1 = new UserRole(u1,r1);
  16. session.save(ur1);
  17. UserRole ur2 = new UserRole(u1,r2);
  18. session.save(ur2);
  19. UserRole ur3 = new UserRole(u2,r1);
  20. session.save(ur3);
  21. UserRole ur4 = new UserRole(u2,r3);
  22. session.save(ur4);
  23. UserRole ur5 = new UserRole(u2,r2);
  24. session.save(ur5);
  25. session.getTransaction().commit();
  26. }catch(Exception e) {
  27. e.printStackTrace();
  28. session.getTransaction().rollback();
  29. }finally {
  30. session.close();
  31. }
  32. }

Hibernate 关联映射 之 多对多 关联(二) 之拆分相关推荐

  1. Hibernate 关联映射 之 多对多 关联(一)

    1.了解几个知识点: 一.一般的设计中,多对多关联映射,需要一个中间表 二.Hibernate会自动生成中间表 三.Hibernate使用many-to-many标签来表示多对多的关联 四.多对多的关 ...

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

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

  3. 【Hibernate步步为营】--关联映射之多对一

    上篇文章讨论了Hibernate的基本映射,一个实体类对应着一张表,在相应的Hibernate Mapping文件中使用<class>标签映射.并且实体类中的普通属性对应着表字段,使用&l ...

  4. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  5. hibernate关联映射:多对一、一对一

    配置对象关联关系 - 单向一对多关系 - 例如:班级与学生 Grade类中 public class Grade{private int gid;private String gname;privat ...

  6. mybatis一对多关联 创建_MyBatis多对多关联查询(级联查询)

    其实,MyBatis 没有实现多对多级联,这是因为多对多级联可以通过两个一对多级联进行替换. 例如,一个订单可以有多种商品,一种商品可以对应多个订单,订单与商品就是多对多的级联关系,使用一个中间表(订 ...

  7. Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射

    在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...

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

    一对多关联映射和多对一关联映射的原理是一致的,都是在多的一端加入一个外键,指向一的一端.但是他们又有所区别,有了多指向一的关系,在加载多的时候可以将一加载上来,而有了一对多的关系,在加载一的时候可以将 ...

  9. hibernate一对多关联映射

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

最新文章

  1. 3dsMax插件V-Ray建筑可视化三维渲染细节技术学习教程
  2. asp.net core 2使用本地https证书
  3. php 表单错误弹窗,PHP表单错误
  4. Windows Azure 数据安全(清理和泄漏)
  5. Windows Server 2008 R2 负载平衡入门篇
  6. [日志]开车要掌握的十六大绝技
  7. Leetcode-MySQL-180. 连续出现的数字
  8. IOS程序之发送短信代码实现
  9. ASP.Net Web 点击链接直接下载 不在浏览器打开
  10. qpython3 获取手机gps接口
  11. IDEA JetBrains Mono 字体安装
  12. 廊坊市博实计算机网络工程有限公司,IP网络终端功放T-7760(含数字IP网络平台终端嵌入软件)...
  13. 真机实战之VLAN隔离,助力网络安全
  14. 【RuoYi-Vue-Plus】学习笔记 02 - OSS模块(二)之文件上传(使用MinIO基于Win10环境)
  15. css 设置图片为灰色
  16. TensorFlow Eager 教程(转)
  17. Cisco VPP(1) 简介
  18. 双目相机标定以及立体测距原理及OpenCV实现
  19. Android 数据库知识回顾
  20. 拓扑容差如何修改_拓扑编辑

热门文章

  1. POJ3757 01分数规划
  2. 【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )
  3. 【错误记录】Android Studio 编译报错 ( Cannot use connection to Gradle distribution . as it has been stopped. )
  4. 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
  5. 【Flutter】Flutter 拍照示例 ( 拍照并获取照片源码示例 | image_picker 0.7.2+1 | Flutter 最新 SDK 安装 )
  6. 【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )
  7. 【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )
  8. 【约束布局】ConstraintLayout 屏障 Barrier 约束 ( 简介 | 屏障适用场景 | 位置说明 | 相关属性 | 可视化操作 | 代码示例 | 总结 )
  9. 末学者daylight__Linux磁盘管理及LVM
  10. python学习笔记 day25 封装