关于项目中hibernate无法删除中间表记录

这是我在做项目的时候碰到的一个头疼问题,记录下来用于以后回顾。我们在学习hibernate时候大概见得最多的老师讲解是使用的Junit单元测试来测试数据:例如下面的代码用于多对多级联操作:

@Test
	public void	 many2(){
		SessionFactory sessionFactory = null;
		Session session=null;
		Transaction tx=null;
		try {
			 sessionFactory=com.spring.one.SessionFactory.getSF();
			session=sessionFactory.openSession();
			tx=session.beginTransaction();
			//让某个用户有某个角色
			User user=new User();
			//查出这个用户
			user=session.get(User.class, 1);
			//查出这个角色
			Roles roles=new Roles();
			Roles roles1=new Roles();
			roles=session.get(Roles.class, 3);
			roles1=session.get(Roles.class, 2);
			//把角色付给用户
			//user.getLset().add(roles);
			//把某个角色去除
			user.getLset().remove(roles);
			
			tx.commit();
			
		} catch (Exception e) {
		  tx.rollback();
		}
		finally{
			session.close();
			sessionFactory.close();
		}
	}


这种可以remove掉Set集合中的对象因为new出来的对象与移除的对象的hashcode值一致。

注意:Set的remove是用hashcode值来判断集合中的对象与移除掉对象是否一致。在项目中我们往往使用spring的注入方式来生成对象的这就使得每个对象的地址会发生改变。因此要想remove掉多对多的中间表我们可以这样做:

public void uncheck(Student student,Course cs) {		
	  //因为Set中的对象是由hashcode来标识的所以不能直接去remove对象,必须先从Set中查出需要remove的对象在移除掉
		Iterator<Course> it=student.getSc().iterator();	      
	    while(it.hasNext()){
		   if(it.next().getCid()==cs.getCid()){
			   it.remove();
		   }
	   }
		hib.merge(student);		
	}

假如学生中所选课程为cs。如果退课如cs我们可以通过遍历Set去比对cs的id相同时把遍历到的对象remove掉


如果有大牛有更好的方法希望不吝赐教。小弟谢过了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值