在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.entity.Student; public class MyTest3 { 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映射多对一单向关联(之二)是一样的。
一对多单向关联也可以是一对多双向关联,因为一对多不会产生冗余。
不像多对一关联,多对一是单向关联,如果多对一双向关联就产生冗余。