
需求:
用户即使用系统的用户,包括业务员、总经理等角色,不同类型的用户使用系统不同的功能,本功能要完成给用户分配角色,功能包括:给用户分配角色、取消用户分配的角色。
分析:
用户信息:单独创建一张用户表,存储使用本系统的用户。
角色信息:单独创建一张角色表,存储用户的角色。
一个用户拥有多个角色
一个角色下边有多个用户
用户和角色多对多关系,单独创建一个关系表记录用户拥有什么角色。
创建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();
}
查看评论