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中成为单向的一对多的映射关系,应 ...
随机推荐
- Javascript中call和apply的区别和用法
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别.其实就是更改对象的内部指针,即改变对象的this指向的内容.这在面向对象的js编程过程中有时是很有用的.call ...
- Devexpress treeList
1.数据绑定最基本的两个属性:KeyFieldName和ParentFieldName. SELECT OfficeID,OfficeName,ParentOfficeID FROM tOffice ...
- html、canvas、视频灰度、反色
效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 20145337 GDB调试汇编堆栈过程分析
20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- android——fargment基础
1.Fragment的产生与介绍 Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应 ...
- Angular 1.x 升级到 Angular 2
原项目用ng1.5写的,现在改成ng2.0了,踩了不少坑,不过都忘记了. 如果你也正好要做这个工作,正好看到这个文章,不妨参考下. AngularJs 1.x -> 2.0 ng-repeat ...
- python奇偶数求和
#求100内奇数和while\for..in循环 sum = 0 i = 1 while i <= 100: sum += i i += 2 print(sum) sum = 0 for i i ...
- doduicms 手机和pc同步 链接处理
sitem.aspx 加上 Session.Add("ismobile", "1"); string mobile = HttpContext.Current. ...
- PHP基础知识之遍历
遍历对象的时候,默认遍历对象的所有属性 class MyClass{ public $var1 = 'value 1'; public $var2 = 'value 2'; publ ...
- IDT HOOK思路整理
IDT(中断描述符表)分为IRQ(真正的硬件中断)和软件中断(又叫异常). HOOK的思路为,替换键盘中断处理的函数地址为自己的函数地址.这样在键盘驱动和过滤驱动之前就可以截获键盘输入. 思路确定之后 ...