您的位置:首页 > 其它

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

2017-05-09 18:03 232 查看
这是我在做项目的时候碰到的一个头疼问题,记录下来用于以后回顾。我们在学习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掉

如果有大牛有更好的方法希望不吝赐教。小弟谢过了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate 多对多