Hibernate 关联映射 之 多对多 关联(二) 之拆分
1、由问题引出一个多对多拆分成两个多对一
问题:Hibernate 关联映射 之 多对多 关联(一)中中间表只是一个存放用户和角色的表,并无其他作用,如果客户有其他的需求,该表就无法扩展。
2、问题解决过程:
用户、角色 之间的关系拆分成用户和用户角色、角色和用户角色的关系,即:两个多对一的关系。
小技巧:如何去判断多对一还是一对多对象,要从对象的角度来看,即:从一个对象的角度去看另一个对象。
用户:
- public class User {
- private int id;
- private String name;
- private String password;
- private Set<UserRole> roles;
用户配置文件:
- <hibernate-mapping>
- <class name="com.shangxuetang.User" table="t_user">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"></property>
- <property name="password"></property>
- <set name="roles">
- <key column="userID"></key>
- <one-to-many class="com.shangxuetang.UserRole"/>
- </set>
- </class>
- </hibernate-mapping>
角色:
- public class Role {
- private int id;
- private String name;
- private Set<UserRole> users;
角色配置文件:
- <hibernate-mapping>
- <class name="com.shangxuetang.Role" table="t_role">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"></property>
- <set name="users">
- <key column="roleID"></key>
- <one-to-many class="com.shangxuetang.UserRole"/>
- </set>
- </class>
- </hibernate-mapping>
用户角色:
- public class UserRole {
- private int id;
- private User user;
- private Role role;
- private Date assignTime;
- public UserRole() {}
- public UserRole(User u,Role r) {
- this.user = u;
- this.role = r;
- this.assignTime = new Date();
- }
用户角色配置文件:
- <hibernate-mapping>
- <class name="com.shangxuetang.UserRole" table="t_userrole">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="assignTime" type="date"></property>
- <many-to-one name="user" column="userID"></many-to-one>
- <many-to-one name="role" column="roleID"></many-to-one>
- </class>
- </hibernate-mapping>
测试示例代码:
- public void testManytoManyChaiFen() {
- Session session = HibernateUtil.getSession();
- try {
- session.beginTransaction();
- User u1 = new User("zhangsan");
- session.save(u1);
- User u2 = new User("lisi");
- session.save(u2);
- Role r1 = new Role("adminstor");
- session.save(r1);
- Role r2 = new Role("usualuser");
- session.save(r2);
- Role r3 = new Role("VIPuser");
- session.save(r3);
- UserRole ur1 = new UserRole(u1,r1);
- session.save(ur1);
- UserRole ur2 = new UserRole(u1,r2);
- session.save(ur2);
- UserRole ur3 = new UserRole(u2,r1);
- session.save(ur3);
- UserRole ur4 = new UserRole(u2,r3);
- session.save(ur4);
- UserRole ur5 = new UserRole(u2,r2);
- session.save(ur5);
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- session.close();
- }
- }
Hibernate 关联映射 之 多对多 关联(二) 之拆分相关推荐
- Hibernate 关联映射 之 多对多 关联(一)
1.了解几个知识点: 一.一般的设计中,多对多关联映射,需要一个中间表 二.Hibernate会自动生成中间表 三.Hibernate使用many-to-many标签来表示多对多的关联 四.多对多的关 ...
- 【Hibernate框架】关联映射(多对多关联映射)
按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...
- 【Hibernate步步为营】--关联映射之多对一
上篇文章讨论了Hibernate的基本映射,一个实体类对应着一张表,在相应的Hibernate Mapping文件中使用<class>标签映射.并且实体类中的普通属性对应着表字段,使用&l ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- hibernate关联映射:多对一、一对一
配置对象关联关系 - 单向一对多关系 - 例如:班级与学生 Grade类中 public class Grade{private int gid;private String gname;privat ...
- mybatis一对多关联 创建_MyBatis多对多关联查询(级联查询)
其实,MyBatis 没有实现多对多级联,这是因为多对多级联可以通过两个一对多级联进行替换. 例如,一个订单可以有多种商品,一种商品可以对应多个订单,订单与商品就是多对多的级联关系,使用一个中间表(订 ...
- Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射
在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...
- 步步为营Hibernate全攻略(二)剪不断理还乱之:一对多关联映射
一对多关联映射和多对一关联映射的原理是一致的,都是在多的一端加入一个外键,指向一的一端.但是他们又有所区别,有了多指向一的关系,在加载多的时候可以将一加载上来,而有了一对多的关系,在加载一的时候可以将 ...
- hibernate一对多关联映射
一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...
最新文章
- 3dsMax插件V-Ray建筑可视化三维渲染细节技术学习教程
- asp.net core 2使用本地https证书
- php 表单错误弹窗,PHP表单错误
- Windows Azure 数据安全(清理和泄漏)
- Windows Server 2008 R2 负载平衡入门篇
- [日志]开车要掌握的十六大绝技
- Leetcode-MySQL-180. 连续出现的数字
- IOS程序之发送短信代码实现
- ASP.Net Web 点击链接直接下载 不在浏览器打开
- qpython3 获取手机gps接口
- IDEA JetBrains Mono 字体安装
- 廊坊市博实计算机网络工程有限公司,IP网络终端功放T-7760(含数字IP网络平台终端嵌入软件)...
- 真机实战之VLAN隔离,助力网络安全
- 【RuoYi-Vue-Plus】学习笔记 02 - OSS模块(二)之文件上传(使用MinIO基于Win10环境)
- css 设置图片为灰色
- TensorFlow Eager 教程(转)
- Cisco VPP(1) 简介
- 双目相机标定以及立体测距原理及OpenCV实现
- Android 数据库知识回顾
- 拓扑容差如何修改_拓扑编辑
热门文章
- POJ3757 01分数规划
- 【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )
- 【错误记录】Android Studio 编译报错 ( Cannot use connection to Gradle distribution . as it has been stopped. )
- 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
- 【Flutter】Flutter 拍照示例 ( 拍照并获取照片源码示例 | image_picker 0.7.2+1 | Flutter 最新 SDK 安装 )
- 【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )
- 【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )
- 【约束布局】ConstraintLayout 屏障 Barrier 约束 ( 简介 | 屏障适用场景 | 位置说明 | 相关属性 | 可视化操作 | 代码示例 | 总结 )
- 末学者daylight__Linux磁盘管理及LVM
- python学习笔记 day25 封装