您的位置:首页 > 其它

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

2014-02-14 22:12 190 查看
一:多对多

用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";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: