在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我们我们的需求是能通过角色获取到其所拥有的操作权限,这就构成了单项的多对多的映射关系,为了管理这个关系,已经不能再通过添加外键列,必须在建立一张关系表,专门负责角色和权限之间的关系映射,如下:

  这里假设有两个用户一个是管理员admin,一个是普通用户user,管理员拥有全部四个权限,而普通用户只拥有用户管理和资料管理的权限,这种关系在hibernate中应该这样配置:

  新建Function实体类:

public class Function {

    private int id;
private String name;
//get/set方法省略
}

  新建Role实体类:

public class Role {

    private int id;
private String name;
private Set<Function> sets=new HashSet<Function>();
//get/set方法省略
}

在当前包下新建Function类的映射文件Function.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wang.pojo">
<class name="Function" >
<id name="id">
<generator class="native"></generator>
</id> <property name="name"></property>
</class>
</hibernate-mapping>

在当前包下新建Role类的映射文件Role.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.wang.pojo">
<class name="Role" >
<id name="id">
<generator class="native"></generator>
</id> <property name="name"></property>
<!-- 单向多对多 -->
<set name="sets" table="role_func" cascade="save-update">
<!-- 表示当前类映射到关系表中的列 -->
<key column="roleId"></key>
<!-- 所对应的另一方在关系表中的列 -->
<many-to-many column="funcId" class="Function"></many-to-many>
</set>
</class>
</hibernate-mapping>

将两个映射文件添加到hibernate.cfg.xml中. 新建一个测试类.测试1:自动生成表2:保存数据3:读取数据:

@Test
public void testCreateDB() {
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
// 第一个参数是否生成ddl脚本 第二个参数是否执行到数据库
se.create(true, true);
} @Test
public void testSave() {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Function f1=new Function();
f1.setName("用户管理");
Function f2=new Function();
f2.setName("资料管理");
Function f3=new Function();
f3.setName("系统管理");
Function f4=new Function();
f4.setName("权限管理"); Role r1=new Role();
r1.setName("admin");
r1.getSets().add(f1);
r1.getSets().add(f2);
r1.getSets().add(f3);
r1.getSets().add(f4);
Role r2=new Role();
r2.setName("user");
r2.getSets().add(f1);
r2.getSets().add(f2);
session.save(r1);
session.save(r2);
tx.commit();
session.close();
} @Test
public void testGet() {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Role r=(Role)session.get(Role.class, 1);
System.out.println("用户:"+r.getName());
Iterator<Function> it = r.getSets().iterator();
while(it.hasNext()){
System.out.print(" "+it.next().getName());
}
tx.commit();
session.close();
}

以上是单向多对多映射关系的代码,如果我们既需要通过查询Role得到Function中的数据,又需要通过查询Fucntion来得到Role中数据,这样就构成了双向的多对多的映射关系,在上面的基础上需要做如下修改:

  1.在Function实体类中添加  private Set<Role> roles=new HashSet<Role>(); 以及对应get/set方法.

  2.在Function.hbm.xml中,添加以下代码:

<!-- 单向多对多   设置由另一方来维护关系-->
<set name="roles" table="role_func" inverse="true" cascade="save-update">
<!-- 表示当前类映射到关系表中的列 -->
<key column="funcId"></key>
<!-- 所对应的另一方在关系表中的列 -->
<many-to-many column="roleId" class="Role"></many-to-many>
</set>

,这样就可以实现从任何一方读取数据都能读到对应的另一方的数据信息了.

hibernate笔记--单(双)向的多对多映射关系的更多相关文章

  1. Hibernate学习(四)———— 双向多对多映射关系

    一.小疑问的解答 问题一:到这里,有很多学习者会感到困惑,因为他不知道使用hibernate是不是需要自己去创建表,还是hibernate全自动,如果需要自己创建表,那么主外键这种设置也是自己设置吗? ...

  2. hibernate(四) 双向多对多映射关系

    序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...

  3. Hibernate中的一对多与多对一映射

    1.需求 一个部门有多个员工;         [一对多] 多个员工,属于一个部门    [多对一] 2.实体Bean设计 Dept: public class Dept { private int ...

  4. java框架篇---hibernate(多对多)映射关系

    以学生和老师为例的来讲解多对多映射. 实体类: Student package cn.itcast.g_hbm_manyToMany; import java.util.HashSet; import ...

  5. Hibernate的多对多映射关系

    example: 老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢?? 在Hibernate ...

  6. Hibernate(五)之一对多&多对一映射关系

    既然我们讲到了一对多和多对一关系,必然要提到多表设计的问题.在开发中,前期需要进行需求分析,希求分析提供E-R图,根据ER图编写表结构. 我们知道表之间关系存在三种: 一对多&多对一:1表(主 ...

  7. hibernate多对多映射关系实现

    Course.hbm.xml: <?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        &q ...

  8. Java中多对多映射关系

    多对对的映射,可以用学生和课程进行演示.一个学生可以选择多个课程,一个课程又对应了多个学生 定义学生类 class Stu{ private String name; private String n ...

  9. hibernate笔记--单向一对多映射方法

    上一篇讲的是单向多对一的表关系,与单向一对多的关系正好相反,如下图所示关系: ,可以看出年级表和学生表是一对多的关系,一条年级信息对应多条学生信息,在hibernate中成为单向的一对多的映射关系,应 ...

随机推荐

  1. Openssl生成证书三板斧

    证书创建三步曲: 一.密钥文件 二.请求文 三.根证书签名 最后看需要是否合并证书文件 1. 创立根证书密钥文件(自己做CA)root.key: [kk@test ~]$ openssl genrsa ...

  2. Ubuntu下安装mod_python报错(GIT错误)

    Ubuntu下安装mod_python3.4.1版本报出如下错误: writing byte-compilation script '/tmp/tmpE91VXZ.py' /usr/bin/pytho ...

  3. 有关于canvas几个新知识点

    对于canvas的初学者来说,以下几点应该是不知道的知识点: 1.canvas有兼容IE6/7/8的脚本文件 下载地址:https://github.com/arv/explorercanvas 2. ...

  4. 网站中使用中文个性字库字体--@font-face解决方案探索 l(转)

    最近的项目有用到特别中文字体,最终效果如下图: 红线标记处均为字体,可选中,交互起来,比图片方便太多了. 解决思路就是将体积巨大的中文字库,取子集,只包涵要使用的那部分文字,因此体积就很小了(包含10 ...

  5. EditPlus快捷键

    Editplus 选中一行: ctrl+rEditplus 复制一行: ctrl+r选择行,然后ctrl+c复制.复制一行到下一行中:Editplus有:Ctrl+j 复制上一行的一个字符到当前行Ed ...

  6. Java中@Override的作用

    @Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1.可以当注释用,方便阅读:2.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.例如 ...

  7. IOS远程推送

    IOS远程推送 一.关于推送通知 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能.是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务器发送到应用程序上的.一般说 ...

  8. ASP.NET Core Docker部署

    前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序. ...

  9. Hadoop学习笔记—10.Shuffle过程那点事儿

    一.回顾Reduce阶段三大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步骤,其中在Reduce阶段总共三个步骤,如下图所示: 其中,Step2.1就 ...

  10. [.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下)

    [.net 面向对象程序设计进阶] (24) 团队开发利器(三)使用SVN多分支并行开发(下) 本篇导读: 接上篇继续介绍SVN的高级功能,即使用分支并行开发.随着需求的不断变更,新功能的增加.特别是 ...