关于hibernate的多对多查询、删除、修改

一:多对多
用MyEclipse反转生成多对多的关系时,中间的关联表不要建自己自增长标示列,在next后面勾选enable many tomany 可以生成多对多的关系,相对来说多对多的hql语句更加简单一些,可以直接查
 注意在注解的配置中,cascade负责的是增、删、改,而fetch负责的是查询
例如 已知student 和teacher的多对多关联表
 查询:
    查询teacher下面的所有学生
        select t.sudentd from Teacher t where t.teacherId=1
    查询学生的所有任课老师
     select s.teachers from Student s where s.studentId=1

   需要注意的是:当类名取了别名之后,条件应该写全,不能直接写 studentId=1,必须写出s.studentId=1
删除:
   当级联关系设子为all时,删除时它默认删除的是三张表:两个实体表和一个关联表,但是比如说我删除的是一个student,应该只在student的表中和关联表中删除记录,teacher表的数据应该不变,此时级联关系不能设置为all,但是不设置成all又会报外键约束,所以便有了这样的思路:先删除关联表的数据,然后再删除student表的数据即可,比如删除一个student
即:String hql1="select t from Teacher t  left join t.students s where s.studentId=1";List<Teacher> teachers找出教这个学生的所有老师
    String hql2=" select s from Student s where s.studentId=1";List<Student> students找出这个学生
    依次删除关联表中关联数据
    for(int i=0;i<teachers.size();i++){
  Teacher t=teachers.getIndex(i);
  t.getStudents.remove(students);
 session.update(t);
  session.flush();在测试中这布必须需要,不然他是在session.commit()时,和delete一起提交,没有达到先删除关联表的目的
 }
    session.delete(students.getIndex(0));//删除学生
修改:直接修改进行了,按照具体条件吧,目前没有发现什么特别的条件
添加:设置级联后也可以直接添加了
修改和删除不推荐使用hql语句
具体见例子testHql
此外:多对多需要配置mappingby  表示主控方与被控方,配置在哪边,哪边就是被控告。增删改只能从主控方来操作,详细例子见Test.java
二:两个一对多
如果没有勾选enable manytomany则默认的生成为两个多对一的表,此时关联表也实例化出来了,不需要生成两个多对多时最后反转时把关联表也选择上
查询:"select st.student from StuTea st left join st.teacher t where t.teacherId=1"
删除就比较简单的了:
先删除关联表,关联表对学生是多对一,对teacher也是多对一,从多的一段删除很容易
  String hql1="delete from StuTea st where st.student.studentId=1";
  session.createQuery(hql1).executeUpdate();
在删除对应的实体表
  String hq="delete Student where studentId=1";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值