Hibernate学习笔记10,用户角色分配,多对多关系表的级联管理

75人阅读 评论(0) 收藏 举报
分类:

需求:

用户即使用系统的用户,包括业务员、总经理等角色,不同类型的用户使用系统不同的功能,本功能要完成给用户分配角色,功能包括:给用户分配角色、取消用户分配的角色。

分析:

用户信息:单独创建一张用户表,存储使用本系统的用户。
角色信息:单独创建一张角色表,存储用户的角色。

一个用户拥有多个角色
一个角色下边有多个用户
用户和角色多对多关系,单独创建一个关系表记录用户拥有什么角色。

创建sys_user、sys_role、sys_user_role三张表
这里写图片描述


映射配置

1.POJO类

User

public class SysUser implements java.io.Serializable {

    private Long userId;
    private String userCode;
    private String userName;
    private String userPassword;
    private String userState;

    //一个用户对应多个角色
    private Set<SysRole> sysRoles = new HashSet<SysRole>();
    /* get和set方法*/
    }

Role

public class SysRole implements java.io.Serializable {

    private Long roleId;
    private String roleName;
    private String roleMemo;

    //一个角色对应多个用户
    private Set<SysUser> sysUsers = new HashSet<SysUser>();
    /* get和set方法*/
    }

2.hbm.xml文件配置

User.hbm.xml
(只列出多对多的配置)

        <!-- 多对多的配置,一个用户有多个角色,当前在用户方配置 -->
        <!-- 
        name:在SysUser中对应角色的set属性名
        table:关系表名
         -->
        <set name="sysRoles" table="sys_user_role">
            <key>
                <!-- 配置当前用户方在关系表中的外键-->
                <column name="user_id"></column>
            </key>
            <!-- 当前用户方对应的角色方的类路径 -->
            <many-to-many class="cn.tuzki.crm.domain.SysRole">
                <!-- SysRole角色表在关系表中的外键 -->
                <column name="role_id"></column>
            </many-to-many>
        </set>

Role.hbm.xml
(只列出多对多的配置)

        <!-- 多对多的配置,一个角色有多个用户,当前在角色方配置 -->
        <!-- 
        name:在SysRole中对应角色的set属性名
        table:关系表名
         -->
        <set name="sysUsers" table="sys_user_role" inverse="true">
            <key>
                <!-- 配置当前角色方在关系表中的外键-->
                <column name="role_id"></column>
            </key>
            <!-- 当前用户方对应的用户方的类路径 -->
            <many-to-many class="cn.tuzki.crm.domain.SysUser">
                <!-- SysUser用户表在关系表中的外键 -->
                <column name="user_id"></column>
            </many-to-many>
        </set>

编写测试类进行测试(对用户角色管理)

1.双方同时添加

(code)

    //双方同时添加,自动向关系表添加记录
    @Test
    public void test1() {

        //创建session
        Session session = HibernateUtil.getCurrentSession();
        //开启事务
        session.beginTransaction();

        //创建用户对象
        SysUser sysUser = new SysUser();
        sysUser.setUserName("大白");
        sysUser.setUserCode("dabai");
        sysUser.setUserPassword("123321");
        sysUser.setUserState("1");

        //创建角色对象
        SysRole sysRole = new SysRole();
        sysRole.setRoleName("秘书");
        //建立关系
        sysUser.getSysRoles().add(sysRole);
        sysRole.getSysUsers().add(sysUser);

        //保存
        session.save(sysUser);
        session.save(sysRole);

        session.getTransaction().commit();
        session.close();

    }

报错:
后台打了两次向关系表插入记录的sql。进行了两次插入关系表
这里写图片描述

原因:
双方都在维护关系

解决方案:
只让一方维护关系。
在role.hbm.xml配置
根据业务需求,让用户方维护关系,因为用户方操作较多。

在角色方的set标签中设置inverse=”true”

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述

2.通过用户维护角色

(code)

    //双方已存在,只维护关系
    //给用户分配角色,给大白增加员工角色
    @Test
    public void  test2() {
        //创建session
        Session session = HibernateUtil.getCurrentSession();
        //开启事务
        session.beginTransaction();

        //查询用户方
        SysUser sysUser = session.get(SysUser.class, 10l);
        //查询角色方
        SysRole sysRole = session.get(SysRole.class, 1l);
        //维护关系
        sysUser.getSysRoles().add(sysRole);
        session.getTransaction().commit();
        session.close();

    }

注意:
因为已经配置为User进行管理,所以执行add的是user方,sysUser.getSysRoles().add(sysRole);
这里写图片描述

3.取消用户分配的角色,删除一方

(code)

    //删除关系
    //删除一方,自动删除相关联的关系记录
    @Test
    public void  test3() {
        //创建session
        Session session = HibernateUtil.getCurrentSession();
        //开启事务
        session.beginTransaction();

        //查询用户方
        SysUser sysUser = session.get(SysUser.class, 10l);
        session.delete(sysUser);
        session.getTransaction().commit();
        session.close();

    }
查看评论

Hibernate 学习笔记 之 多对多关系 及其 级联操作

一、多对多配置 User.java/** * Created by Donald on 2016/11/20. */ public class User { private Intege...
  • fanfan4569
  • fanfan4569
  • 2016-11-20 11:53:44
  • 1757

Hibernate中的表的多对多关系及操作

表的多对多关系及操作 多对多的表关系表达 表: 使用中间表,分别引用两方的ID 对象:  两方都使用集合表达 配置: 操作: inverse: 我是否要放弃...
  • CSDN_GIA
  • CSDN_GIA
  • 2017-01-23 16:43:42
  • 1398

hibernate多对多关系查询

用户sys_userinfo和角色sys_role,典型的多对多关系, 用户表:sys_userinfo 角色表:sys_role 关联表:rel_user_role 用户sysUserInfo:...
  • tomcat_2014
  • tomcat_2014
  • 2015-12-24 11:01:27
  • 5195

hibernate一对一,一对多,多对一,多对多关系映射与级联

hibernate一对一,一对多,多对一,多对多关系映射与级联
  • Javacghv
  • Javacghv
  • 2015-08-07 20:33:12
  • 1249

Spring整合hibernate 双向多对多级联删除问题

最近在在做一个项目的时候,遇到关于hibernate的双向多对多级联删除的问题,上网搜索关于多对多删除的解释很少,但是双向多对多级联删除的需求也有很多,花了一整天时间才彻底弄明白级联删除的相关细节问题...
  • ShiLuoHeroKing
  • ShiLuoHeroKing
  • 2016-04-25 10:13:42
  • 1732

Hibernate ManytoMany 标注级联增删改查完整操作

我们在用户和角色的概念上经常要用到多对多关系本文综合全部情况统一进行说明 实现了的操作: - 保存新增User用户的时候保存新的Role - 新增User用户绑定已有Role后保存关系 - 删除用户时...
  • colourrain
  • colourrain
  • 2015-02-05 17:29:27
  • 1327

hibernate多对多关系配置--增删改查

hibernate多对多关联配置--并实现增删改查          hibernate就不多介绍了,这里就直接上我项目中使用的例子做说明。          数据模型 这是项目中用...
  • cb2474600377
  • cb2474600377
  • 2016-04-08 10:19:06
  • 4279

jpa hibernate(1) 多对多,用户新增,只增加中间表对应角色关系,不增加角色role

用户user 角色role 中间表user_role,用户新增,只增加中间表对应角色关系,不增加角色role 只增加关联关系到中间表中,需要添加CascadeType.MERGEUser实体: @M...
  • fengcai0123
  • fengcai0123
  • 2017-06-30 12:08:27
  • 1101

Hibernate多对多双向关联,Annotation与映射文件方式。解决中间表无法插入数据。

设计员工,岗位关系,多对多双向关联。类图:用Hibernate创建的表图:实体类:public class User { private Long id; private Set ro...
  • JYH1314
  • JYH1314
  • 2016-04-13 10:41:49
  • 1590

Hibernate4注解详解之多对多对象映射

3.多对多(在多对多的使用上,建议使用表间关联方式,使用外键关联冗余数据较为严重)        1.1多对多外键关联          Test和SubTest的id为auto_increment ...
  • beadle233
  • beadle233
  • 2015-04-01 14:13:37
  • 955
    个人资料
    持之以恒
    等级:
    访问量: 725
    积分: 192
    排名: 35万+
    文章存档
    最新评论