最近在一篇文章中看到如下的内容:

session.delete(parent);
如果parent的children已经初始化(包括之前同一session中执行parent= (Parent) session.load(Parent.class,parent.getId());),
若parent的cascade含有delete或delete-orphan
则:update Child set parentId=null where parentId=?
delete from Child where id=?
delete from Parent where id=?
否则只执行:
update Child set parentId=null where parentId=?
delete from Parent where id=?如果parent的children没有初始化,同样只执行
update Child set parentId=null where parentId=? 
delete from Parent where id=?
不会对Child进行删除
即使cascade为none 同样会执行 update Child set parentId=null where parentId=?
cascade为delete-orphan 并不会删除Child中parentId为null的对象

结合新近一个项目中,级联删除操作中出现的问题,发现hibernate在删除父表内容的时候,的确是首先将子表的parentid首先置为null,然后再执行父表和子表的删除操作,不禁产生疑惑,是否在级联删除的情况中,数据库中子表不应该将parentid设为非空属性,否则在执行delete的时候hibernate将无法执行update Child set parentId=null where parentId=?操作,但是这样的话是否意味着使用hibernate的级联操作就需要牺牲数据库约束,而将约束放置在hibernate上实现?
我的代码如下:
hbm.xml:
父表:
<class name="StudyReport" table="STUDY_REPORT" lazy="false" dynamic-insert="true" dynamic-update="true">
<id name="reportID" type="java.lang.Long" unsaved-value="null" >
<column name="REPORT_ID" length="9" not-null="true"/>
<generator class="identity"/>
</id>
............................
<set name="rankSet" cascade="delete-orphan">  //delete all-delete-orphan 均是同一现象
<key>
<column name="REPORT_ID" not-null="true"/>
</key>
<one-to-many class="StudyReportRank" />
</set>
</class>
子表:<class name="StudyReportRank" table="STUDY_REPORT_RANK" lazy="false">
<id name="seqID" type="java.lang.Long" unsaved-value="null" >
<column name="SEQ_ID" length="9" not-null="true"/>
<generator class="identity"/>
</id> <property name="reportID" type="java.lang.Long">
<column name="REPORT_ID" length="9" not-null="true"/>
</property>
.....
</class>父表 DAO:
......
public void delete(StudyReport studyReport) {
getHibernateTemplate().delete(studyReport);
}
.....