一、使用用户User和Role实现多对多的示例

User.java,实现对Role的引用

package com.lxit.entity;

import java.util.HashSet;
import java.util.Set; public class User {
public User(){ } public User(String userid, String userName, String userPwd) {
this.userid = userid;
this.userName = userName;
this.userPwd = userPwd;
} private String userid;
private String userName;
private String userPwd;
private Set<Role> roles = new HashSet<Role>(); public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
} }

User.hbm.xml配置文件,映射一个多对多的集合,并开启级联效果,由User来维护级联效果

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.lxit.entity.User" table="User">
<id name="userid" type="java.lang.String">
<generator class="assigned" />
</id>
<property generated="never" lazy="false" name="userName"
type="java.lang.String">
<column length="20" name="userName" not-null="true" />
</property>
<property generated="never" lazy="false" name="userPwd"
type="java.lang.String">
<column length="20" name="userPwd" not-null="true" />
</property>
<set name="roles" table="user_role" cascade="all">
<key column="userid" />
<many-to-many column="roleid" class="com.lxit.entity.Role" />
</set>
</class>
</hibernate-mapping>

Role.java 角色类,同样也映射Users集合

package com.lxit.entity;

import java.util.HashSet;
import java.util.Set; public class Role { public Role() {
} public Role(String roleName, String roleDesc) {
this.roleName = roleName;
this.roleDesc = roleDesc;
} private int roleId;
private String roleName;
private String roleDesc;
private Set<User> users = new HashSet<User>(); public int getRoleId() {
return roleId;
}
public void setRoleId(int roleId) {
this.roleId = roleId;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRoleDesc() {
return roleDesc;
}
public void setRoleDesc(String roleDesc) {
this.roleDesc = roleDesc;
} public Set<User> getUsers() {
return users;
} public void setUsers(Set<User> users) {
this.users = users;
}
}

User.hbm.xml映射文件,映射User多对多关系,并设置inverse="true"。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.lxit.entity.Role" table="role">
<id name="roleId" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<property name="roleName" type="java.lang.String">
<column name="roleName" length="20" not-null="true"></column>
</property>
<set name="users" table="user_role" inverse="true">
<key column="roleid"></key>
<many-to-many column="userid" class="com.lxit.entity.User" />
</set>
</class>
</hibernate-mapping>

添加Mapping映射文件

<mapping resource="com/lxit/entity/Role.hbm.xml" />
<mapping resource="com/lxit/entity/User.hbm.xml" />

最后测试类

public static void main(String[] args) {
Role sys = new Role("admin", "系統管理员");
Role teacher = new Role("teacher","教师"); User user1 = new User("admin", "管理员", "123123");
User user2 = new User("zhangsan", "张三疯", "123123"); user1.getRoles().add(sys);
user1.getRoles().add(teacher);
user2.getRoles().add(teacher); Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//session.save(sys);
//session.save(teacher); session.save(user1);
session.save(user2);
tx.commit(); }

以上,只需要将role添加到user就会自动生成多对多的权限,多对多必须使用第三张表来实现权限效果。不能为在第三张表添加映射文件。

Hibernate关系映射(三) 多对多的更多相关文章

  1. Hibernate学习笔记-Hibernate关系映射

    1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...

  2. MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟/懒加载

    一.myBatis对象关系映射(多对一关系.一对多关系) 1.多对一关系: ---例子:多个员工同属于一个部门. (1)myBatis发送 额外SQL: ■ 案例:员工表通过 dept_id 关联 部 ...

  3. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  4. 【SSH 基础】浅谈Hibernate关系映射(4)

    继上篇博客 多对多关联映射(单向) 多对多对象关系映射,须要增加一张新表完毕基本映射. Hibernate会自己主动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多 ...

  5. web进修之—Hibernate 关系映射(3)

    概述 Hibernate的关系映射是Hibernate使用的难点或者是重点(别担心,不考试哦~),按照不同的分类方式可以对这些映射关系做一个分类,如: 按对象对应关系分: 一对一 多对一/一对多 多对 ...

  6. Hibernate关联映射(多对一 --- many-to-one)

    转自:https://blog.csdn.net/fengxuezhiye/article/details/7369786?utm_source=blogxgwz9 Hibernate的关联映射关系有 ...

  7. 【转载】Hibernate关系映射

    1.        单向一对一关联映射(one-to-one): 两个对象之间一对的关系,例如:Person(人)-IdCard(身份证) 有两种策略可以实现一对一的关联映射: *主键关联:即让两个对 ...

  8. Hibernate关系映射时出现的问题

    在学习Hibernate框架的关系映射时,遇到了一个问题: INFO: HHH000422: Disabling contextual LOB creation as connection was n ...

  9. Hibernate关系映射(三) 多对一和一对多

    一.多对一 学生Student和班级Grade实现多对一,多个学生对应一个班级. Student.java实体类,映射了班级的属性. package com.lxit.entity; import j ...

随机推荐

  1. 【转载】TabLayout 源码解析

    原文地址:https://github.com/Aspsine/AndroidSdkSourceAnalysis/blob/master/article/TabLayout%E6%BA%90%E7%A ...

  2. 查看所有shell类型

    [xf@xuexi ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/no ...

  3. Flask实战第57天:UEditor编辑器集成以及配置上传文件到七牛

    相关链接 UEditor:http://ueditor.baidu.com/website/​ 下载地址:http://ueditor.baidu.com/website/download.html# ...

  4. 【UOJ #131】【NOI 2015】品酒大会

    http://uoj.ac/problem/131 求出后缀数组和height数组后,从大到小扫相似度进行合并,每次相当于合并两个紧挨着的区间. 合并区间可以用并查集来实现,每个区间的信息都记录在这个 ...

  5. JZYZOJ1537 [haoi2014]贴海报

    http://172.20.6.3/Problem_Show.asp?id=1537 用的方法叫作浮水法,实质是递归自下而上判断一个区间有没有覆盖,O(n^2)感觉也没有很实用. 前几年的haoi怎么 ...

  6. AGC 020 B - Ice Rink Game

    题面在这里! 倒着维护可以取的范围区间,判一下可不可能无解即可. #include<bits/stdc++.h> #define ll long long using namespace ...

  7. BZOJ 1834 [ZJOI2010]network 网络扩容(费用流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题目大意] 给定一张有向图,每条边都有一个容量C和一个扩容费用W. 这里扩容费 ...

  8. 【最大权森林/Kruskal】POJ3723-Conscription

    [题目大意] 招募m+n个人每人需要花费$10000,给出一些关系,征募某个人的费用是原价-已招募人中和他亲密值的最大值,求最小费用. [思路] 人与人之间的亲密值越大,花费越少,即求出最大权森林,可 ...

  9. Team Queue(POJ 2259)

    题意:有若干个团体,每个团体有若干个元素,他们按次序来排队,如果队列中已经有同一团体的元素在,则可以插队到它后面,模拟这个过程 思路:用map存下元素与团体的关系,并开2个队列,一个存整体队伍的排列( ...

  10. CentOS 6.9下KVM虚拟机快照创建、删除、恢复(转)

    使用文件快照的方式实现文件备份,但单说快照(snapshot)的话,他是某一时间点(版本)你能看到的该时间点备份文件状态的全貌,通过文件的快照(全貌)你能恢复到特定时间点(版本)的文件状态. 创建虚拟 ...