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

需求:

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

分析:

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

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

创建sys_user、sys_role、sys_user_role三张表
Hibernate学习笔记10,用户角色分配,多对多关系表的级联管理_第1张图片


映射配置

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 sysRoles = new HashSet();
    /* get和set方法*/
    }

Role

public class SysRole implements java.io.Serializable {

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

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

2.hbm.xml文件配置

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

        
        
        <set name="sysRoles" table="sys_user_role">
            <key>
                
                <column name="user_id">column>
            key>
            
            <many-to-many class="cn.tuzki.crm.domain.SysRole">
                
                <column name="role_id">column>
            many-to-many>
        set>

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

        
        
        <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">
                
                <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。进行了两次插入关系表
Hibernate学习笔记10,用户角色分配,多对多关系表的级联管理_第2张图片

原因:
双方都在维护关系

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

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

Hibernate学习笔记10,用户角色分配,多对多关系表的级联管理_第3张图片

Hibernate学习笔记10,用户角色分配,多对多关系表的级联管理_第4张图片
Hibernate学习笔记10,用户角色分配,多对多关系表的级联管理_第5张图片
这里写图片描述

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);
Hibernate学习笔记10,用户角色分配,多对多关系表的级联管理_第6张图片

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学习笔记)