一:多对多
用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";