前言
- 用户,角色,权限是OA系统中最常见的问题,一个用户是是什么角色,一种角色应该被分配什么样的权限……,由于小编做的OA系统操作数据库是封装的Hibernate,所以今天就拿用户与角色这个多对多关系的例子来总结一下Hibernate中的多对多操作。
User.hbm.xm
<hibernate-mapping>
<class name="com.dmsd.elec.domain.User" table="User">
<id name="userID" type="string" column="userID">
<generator class="uuid"></generator>
</id>
<property name="userName" type="string" column="userName"></property>
<property name="logonName" type="string" column="logonName"></property>
……
<!-- inverse="true"--> 表示中间表user_role 由role一方来维护,也就是说,当role与user绑定关系时,要通过role来操作CRUD,操作如下
<set name="Roles" table="user_role" inverse="true">
<key>
<column name="userID"></column>
</key>
<many-to-many class="com.dmsd.elec.domain.Role" column="roleID"/>
</set>
</class>
</hibernate-mapping>
EleRole.hbm.xml
<hibernate-mapping>
<class name="com.dmsd.elec.domain.Role"table="Role">
<id name="roleID" type="string" column="roleID">
<generator class="assigned"></generator>
</id>
<property name="roleName" type="string" column="roleName"></property>
<set name="Users" table="user_role">
<key>
<column name="roleID"></column>
</key>
<many-to-many class="com.dmsd.elec.domain.User" column="userID"/>
</set>
</class>
</hibernate-mapping>
User
public class ElecUser implements java.io.Serializable {
private String userID; //主键ID
private String userName; //用户姓名
private String logonName; //登录名
......
private Set<ElecRole> elecRoles = new HashSet<ElecRole>();
public Set<ElecRole> getElecRoles() {
return elecRoles;
}
public void setElecRoles(Set<ElecRole> elecRoles) {
this.elecRoles = elecRoles;
}
......
......
}
Role
public class ElecRole implements java.io.Serializable {
private String roleID; //主键ID
private String roleName; //角色名称
private Set<ElecUser> elecUsers = new HashSet<ElecUser>();
public Set<ElecUser> getElecUsers() {
return elecUsers;
}
public void setElecUsers(Set<ElecUser> elecUsers) {
this.elecUsers = elecUsers;
}
//get和set方法省略
......
......
}
- 当用户与角色建立关系时,也就是操作中间表euser_role的时候,系统中并没有user_role的javabeen和user_role.hbm.xml配置文件,他们之间的操作是利用关系来操作的。下面的demo是向中间table=”user_role”中插入数据。
比如说增加操作
private void saveUserRole(String roleID, String[] selectusers) {
// 1:使用角色ID,查询角色对象ElecRole,获取到该角色对应的用户的Set集合
ElecRole elecRole = elecRoleDao.findObjectByID(roleID);
/** 方案一,此方案也适用于更新user与role之间的操作,先删除,后增加,这样可以达到更新操作 */
Set<ElecUser> elecUsers=elecRole.getElecUsers();
//2:解除Set集合的关联关系(删除中间表)
elecUsers.clear();
//3:遍历用户ID的数组,重新建立Set集合的关联关系
if (selectusers!=null && selectusers.length>0) {
for (String userID : selectusers) {
ElecUser elecUser=new ElecUser();
elecUser.setUserID(userID);
elecUsers.add(elecUser);
}
}
elecRole.setElecUsers(elecUsers);
}
删除操作
public void deleteUserByID(ElecUser elecUser) {
String userID =elecUser.getUserID();
String [] userIDs =userID.split(", ");
if(userIDs!=null && userIDs.length>0){
//获取每个用户的ID
for(String uid:userIDs){
//使用用户ID,查询用户对象,获取当前用户具有的附件
ElecUser user=elecUserDao.findObjectByID(uid);
Set<ElecUserFile> elecUserFiles=user.getElecUserFiles();
//先通过user得到role集合
Set<ElecRole> elecRoles=user.getElecRoles();
if (elecRoles!=null && elecRoles.size()>0) {
for (ElecRole elecRole : elecRoles) {
//然后通过role集合得到user集合,然后再此基础上删除指定的user,此时,中间表中user与role相对应的数据被删除
elecRole.getElecUsers().remove(user); }
}
}
}
//删除用户的信息
elecUserDao.deleteObjectByIds(userIDs);
}
更新操作
这种user与role之间的更新操作如果数据量不大的话,我们可以采用先删除后增加的方法,在此小编省略代码…….
小结
- 以上是小编对Hibernate多对多操作的总结,挺基础的,就当是笔记吧!