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

版权声明:本博客的所有内容,包括文字、图片,均为本人原创。转载请附上来源。 https://blog.csdn.net/weixin_37659242/article/details/79949200

需求:

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

分析:

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

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

创建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();

    }
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页