在Hibernate映射一对多单向关联(之二)中,可以检索出一个Student所对应的所有课程,放在一个HashSet中。
如果一个学生的记录被删除了,就应该考虑到它的其他信息也全部删除掉,比如他的全部课程记录。
将Student.hbm.xml中cascade值设置为如下:
cascade="all"
或者
cascade="all-delete-orphan"
cascade="all",既能满足我们save-update的需要,又能实现级联delete。cascade="all-delete-orphan",则如果还有很多与Student有关的表,则所有这些表中的记录都会被级联删除掉。
如果不需要级联存储更新,即save-update,则cascade可以设置为delete。
假设我们要删除了学号为200802001的Student,同时删除他的所有课程记录。
测试程序如下:
package org.shirdrn.test;
import java.util.List;
import java.util.Set;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.shirdrn.HibernateSessionFactory;
import org.shirdrn.entity.Student;
public class MyTest {
public static void main(String[] args){
Session session = HibernateSessionFactory.getSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Student dbStu = (Student)session.load(Student.class, "200802001");
Criteria c = session.createCriteria(Student.class);
c.add(Restrictions.eq("sno", "200802001"));
List list = c.list();
Student stu = (Student)list.get(0);
Set hsSet = stu.getScs();
stu.setScs(hsSet);
session.delete(stu);
tx.commit();
}
catch(Exception e){
tx.rollback();
e.printStackTrace();
}
finally{
HibernateSessionFactory.closeSession();
}
}
}
执行结果:
Hibernate: select this_.sno as sno0_, this_.sname as sname0_0_, this_.dept as dept0_0_ from student this_ where this_.sno=?
Hibernate: select scs0_.sno as sno1_, scs0_.cno as cno1_, scs0_.sno as sno0_, scs0_.cno as cno0_, scs0_.cname as cname4_0_, scs0_.score as score4_0_ from sc scs0_ where scs0_.sno=?
Hibernate: delete from sc where sno=? and cno=?
Hibernate: delete from sc where sno=? and cno=?
Hibernate: delete from sc where sno=? and cno=?
Hibernate: delete from student where sno=?
大概的过程就是:先检索出Student对应于Sc中的记录,通过Student的对象获取Sc的HashSet记录集,再set到Student的对象中。在删除Student的对象的时候,级联删除了所有对应于该Student的Sc中记录。
一对多双向关联中,多对一单向关联和Hibernate映射多对一单向关联(之一)、Hibernate映射多对一单向关联(之二)是一样的。
一对多单向关联也可以是一对多双向关联,因为一对多不会产生冗余。
不像多对一关联,多对一是单向关联,如果多对一双向关联就产生冗余。