Hibernate下多对多关联的数据库语句

最近在hibernate下,两张表多对多关联,使用HQL语句进行增删改查时遇到很多问题,现在小结一下:

有两张表格,角色表(role)和权限表(right),中间表是(base_role_right)

(1)删除某个角色,由于role与right表已经相关联,如果直接删除角色的话,会将right表中的记录同时删除

          解决思路:通过获取前台传递的参数roleId找到要删除的对象,然后先将此对象中与right相关联的属性rights先移除,然后再删除对象,

                              这样right表中信息便不会被同步删除

          代码:domain层,Role.java里面声明rights

<span style="font-size:12px;"><span style="background-color: rgb(255, 255, 255);">	//角色与权限多对多关系,中间表是base_role_right
	@ManyToMany(cascade = { CascadeType.MERGE, CascadeType.REMOVE },fetch = FetchType.LAZY)
	@JoinTable(name = "base_role_right", joinColumns = { @JoinColumn(name = "roleId", referencedColumnName = "roleId") }, inverseJoinColumns = { @JoinColumn(name = "rightId", referencedColumnName = "rightId") })
	<span style="color:#FF6666;">private List<Right> rights = new ArrayList<Right>();</span>// 对应权限的集合

         BizImpl层:

        </span></span><pre name="code" class="java"><span style="background-color: rgb(255, 255, 255);">        public void deleteRoles(String roleIds) {
               //将传递的字符串参数去掉分隔符“,”
                String[] id_array = roleIds.split(",");
		int[] ids = new int[id_array.length];
		
		for(int i=0 ;i < id_array.length; i++){//遍历所有的roleId
			ids[i]=Integer.parseInt(id_array[i]);//将字符串转化为整型数
			Role role = roleDao.get(ids[i]);
			List<Right> rightList = role.getRights();
			
			//先将role里面的所有right移除,再删除角色,确保权限表里面的记录不被同时删除
			<span style="color:#FF6666;"> for (Iterator<Right> iter = rightList.iterator(); iter.hasNext();) {
		            iter.next();  		          
		            iter.remove();  		          
		        }  </span>
			roleDao.delete(ids[i]);
		}</span>
	}
(2)查询时需要两张表里面的数据,此时要采用连接(这里采用右连接查询某个用户角色还没添加的权限)
     public  JSONData<Right> queryNoAddPermission(Integer roleId,Integer start,Integer limit){
		StringBuffer hql = new StringBuffer();
		Map<String, Object> map = new HashMap<String, Object>();
		<span style="color:#FF6666;">hql.append("SELECT NEW com.eaglec.wx.base.view.NoAddPermissionParam(r.rightId,r.text,r.idxtype) FROM Right r WHERE 1=1 AND"
				+ " r.rightId NOT IN (select rt.rightId FROM Role re right join re.rights rt WHERE 1=1 AND re.roleId=:roleId)");</span>
		if(roleId != null){
			map.put("roleId",roleId);//使用HQL语句中含有参数的话,必须为此参数赋值,否知运行时报错
		}
		return rightDao.outJSONData(hql.toString(), map,start, limit);				
	}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值