hibernate笔记--单(双)向的多对多映射关系
在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表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笔记--单(双)向的多对多映射关系的更多相关文章
- Hibernate学习(四)———— 双向多对多映射关系
一.小疑问的解答 问题一:到这里,有很多学习者会感到困惑,因为他不知道使用hibernate是不是需要自己去创建表,还是hibernate全自动,如果需要自己创建表,那么主外键这种设置也是自己设置吗? ...
- hibernate(四) 双向多对多映射关系
序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...
- Hibernate中的一对多与多对一映射
1.需求 一个部门有多个员工; [一对多] 多个员工,属于一个部门 [多对一] 2.实体Bean设计 Dept: public class Dept { private int ...
- java框架篇---hibernate(多对多)映射关系
以学生和老师为例的来讲解多对多映射. 实体类: Student package cn.itcast.g_hbm_manyToMany; import java.util.HashSet; import ...
- Hibernate的多对多映射关系
example: 老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢?? 在Hibernate ...
- Hibernate(五)之一对多&多对一映射关系
既然我们讲到了一对多和多对一关系,必然要提到多表设计的问题.在开发中,前期需要进行需求分析,希求分析提供E-R图,根据ER图编写表结构. 我们知道表之间关系存在三种: 一对多&多对一:1表(主 ...
- hibernate多对多映射关系实现
Course.hbm.xml: <?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC &q ...
- Java中多对多映射关系
多对对的映射,可以用学生和课程进行演示.一个学生可以选择多个课程,一个课程又对应了多个学生 定义学生类 class Stu{ private String name; private String n ...
- hibernate笔记--单向一对多映射方法
上一篇讲的是单向多对一的表关系,与单向一对多的关系正好相反,如下图所示关系: ,可以看出年级表和学生表是一对多的关系,一条年级信息对应多条学生信息,在hibernate中成为单向的一对多的映射关系,应 ...
随机推荐
- Spark优化之二:集群上运行jar程序,状态一直Accepted且不停止不报错
如果运行Spark集群时状态一直为Accepted且不停止不报错,比如像下面这样的情况: 15/06/14 11:33:33 INFO yarn.Client: Application report ...
- HDU--跑道相遇
跑道相遇 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...
- *HDU 1115 计算几何
Lifting the Stone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 字节流与数据类型的相互转换---使用struct模块
字节流与数据类型的相互转换---使用struct模块 http://blog.csdn.net/Sunboy_2050/article/details/5974029 Python是一门非常简洁的语言 ...
- .Net 跨平台可移植类库PCL可用于任何平台包括Mono
Microsoft 在 .NET Framework 4 中添加了一个名为可移植类库 (PCL) 的新功能. 利用 PCL,您可以有选择性地面向 .NET Framework.Silverlight ...
- SQL SERVER全面优化-------索引有多重要?
想了好久索引的重要性应该怎么写?讲原理结构?我估计大部分人不愿意看,也不愿意花那么多时间仔细研究.光写应用?感觉不明白原理一样不会用.举例说明?情况太多也写不全....到底该怎么写呢? 随便写吧,想到 ...
- 《HiWind企业快速开发框架实战》(2)使用HiWind创建自己的项目
<HiWind企业快速开发框架实战>(2)使用HiWind创建自己的项目 关于HiWind HiWind企业快速开发框架,是基于.NET+EasyUi(支持各种前端扩展,后面将扩展Boot ...
- gulp使用小结(一)
这篇文章不会介绍 gulp 的起源.发展:不会去一个个讲解 gulp API:也不想出现大段大段的 gulpfile.js 代码:更木有帮你分析 gulp 实现原理,只有一些我自己对 gulp 的使用 ...
- C# Azure 存储-队列
1.前言 本篇文章是根据Azure的官网document总结,如果想直接跳过本文章,可以点击下面的链接进入. https://www.azure.cn/zh-cn/documentation/arti ...
- Bootstrap~学习笔记索引
回到占占推荐博客索引 bootstrap已经用了有段时间了,感觉在使用上还是比较容易接受的,在开发人员用起来上,也还好,不用考虑它的兼容性,手机,平台,PC都可以有效的兼容. bootstrap官方a ...