《Hibernate》-----ManyToMany

前言

  • 用户,角色,权限是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多对多操作的总结,挺基础的,就当是笔记吧!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值