1、了解几个知识点:

一、一般的设计中,多对多关联映射,需要一个中间表
二、Hibernate会自动生成中间表
三、Hibernate使用many-to-many标签来表示多对多的关联
四、多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的

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<Role> 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" table="t_user_group">
  9. <key column="userId"></key>
  10. <many-to-many class="com.shangxuetang.Role" column="roleId"></many-to-many>
  11. </set>
  12. </class>
  13. </hibernate-mapping>

需要注意的是:映射文件中属性table是必须有的;many-to-many 中属性column是必须有的(中间映射表中,关联目标表的关联字段),class是必须有的(关联目标类)

[java] view plain copy print?
  1. public class Role {
  2. private int id;
  3. private String name;
  4. private Set<User> 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" table="t_user_group">
  8. <key column="roleId"></key>
  9. <many-to-many class="com.shangxuetang.User" column="userId"></many-to-many>
  10. </set>
  11. </class>
  12. </hibernate-mapping>

测试示例代码:

[java] view plain copy print?
  1. public void  testManytoMany() {
  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("管理员");
  10. session.save(r1);
  11. Role r2 = new Role("普通用户");
  12. session.save(r2);
  13. Role r3 = new Role("VIP用户");
  14. session.save(r3);
  15. u1.addRole(r1).addRole(r3);
  16. u2.addRole(r2);
  17. r1.addUser(u2);
  18. session.getTransaction().commit();
  19. }catch(Exception e) {
  20. e.printStackTrace();
  21. session.getTransaction().rollback();
  22. }finally {
  23. session.close();
  24. }
  25. }

Hibernate 关联映射 之 多对多 关联(一)相关推荐

  1. Hibernate 关联映射 之 多对多 关联(二) 之拆分

    1.由问题引出一个多对多拆分成两个多对一 问题:Hibernate 关联映射 之 多对多 关联(一)中中间表只是一个存放用户和角色的表,并无其他作用,如果客户有其他的需求,该表就无法扩展. 2.问题解 ...

  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. 【SSH系列】Hibernate映射 -- 一对多关联映射

         映射原理        一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入 ...

最新文章

  1. 用计算机计算教学反思,《用计算器计算》教学反思
  2. 201621123055《JAVA程序设计》第七周学习总结
  3. Mysql主主复制高可用解决方案
  4. (1)DBA查询:数据库
  5. java.lang中String=和equals()函数解析
  6. OAuth2.0(基于django2.1.2实现版本)
  7. linux IPv4报文处理浅析
  8. PPP协议的配置(以H3C模拟器为例)
  9. paip.提升用户体验---c++ qt 悬浮窗实现
  10. 程序员如何成为一名自由职业者?
  11. ckplayer网页播放器简易教程
  12. jQuery fadeOut() 方法
  13. 小程序码 踩坑记录(buffer转成图片显示问题)
  14. 捣鼓PlantUML(一、环境)
  15. 行癫:只有合作伙伴和客户成功,才是阿里云的成功
  16. 直播系统解决方案:直播平台如何开发搭建
  17. 开源三轴云台EVVGC(simple BGC)分析
  18. RGB颜色转换为16进制颜色
  19. jsp_servle(3)
  20. Conda环境无法激活

热门文章

  1. 【Linux 内核】进程管理 ( 进程相关系统调用源码分析 | fork() 源码 | vfork() 源码 | clone() 源码 | _do_fork() 源码 | do_fork() 源码 )
  2. 【数字信号处理】傅里叶变换性质 ( 傅里叶变换频移性质示例 | PCM 音频信号处理 | 使用 matlab 进行频移操作 )
  3. 【Groovy】自定义 Xml 生成器 BuilderSupport ( setParent 方法中设置父节点与子节点关系 )
  4. 【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 使用 MetaClass 进行方法拦截 | 对象上拦截方法 | 类上拦截方法 )
  5. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexFile loadDexFile 函数 | 构造函数 | openDexFile 函数 )
  6. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 linker 中的 dlopen 函数地址 并 通过 远程调用 执行该函数 )
  7. 【Android RTMP】NV21 图像旋转处理 ( 快速搭建 RTMP 服务器 Shell 脚本 | 创建 RTMP 服务器镜像 | 浏览器观看直播 | 前置 / 后置摄像头图像旋转效果展示 )
  8. 安卓网络类型设置的实现
  9. mybatis映射器${}和#{}的区别
  10. 几种典型的软件自动化测试框架