需求
在删除页面的同时,删除相对应的问题
实体关联关系:
方案一(Hibernate 级联删除):
- 页面类(一方)的Page.hbm.xml的配置
<set name="questions" inverse="true" cascade="delete" order-by="id" lazy="false"><!--[1]-->
<key column="pageid"></key>
<one-to-many class="Question"/>
</set>
**关键点**:cascade="delete" 和 lazy="false"
- 主要删除方法代码
@Test
public void deletePageByCasecade(){
SurveyService ss = (SurveyService) ac.getBean("surveyService");
Page page = ss.getPage(1);
//当然这里还可以优化下,即 在 [1] 处配置 fetch="join" ,一条sql 得到 page 和 包含的 questions
ss.deletePageCaseCade(page);
}
- 生成 sql 语句
hibernate 先要得到 page 和相应的 question 记录
Hibernate:
select
*
from
pages page0_
where
page0_.id=?
Hibernate:
select
*
from
questions questions0_
where
questions0_.pageid=?
order by
questions0_.id
然后 根据 questions 的 主键 一个一个的删除(而不是根据外间 pageid),即,page 中有多少个问题,便执行多少条 sql
Hibernate:
delete
from
questions
where
id=?
Hibernate:
delete
from
questions
where
id=?
Hibernate:
delete
from
questions
where
id=?
Hibernate:
delete
from
questions
where
id=?
...
最后删除 页面类(一方)
Hibernate:
delete
from
pages
where
id=?
小结:
hibernate 的级联删除:
先查询,
再删除:先删除多方(孩子),再删除一方(父),按主键一个一个删除。
如果一个页面包含100个问题,就要执行 1+100 条删除语句
方案二(hql编程实现删除):
- 主要删除方法代码
@Test
public void deletePageByHql(){
SurveyService ss = (SurveyService) ac.getBean("surveyService");
ss.deletePage(6);
}
/*主要代码*/
service 层
public void deletePage(Integer pid) {
//answer
//String hql="delete from Answer a where a.questionId in ( select q.id from Question q where q.page.id=? )";
//this.answerDao.batchEntityByHQL(hql, pid);
//question
hql="delete from Question q where q.page.id=?";
this.questionDao.batchEntityByHQL(hql, pid);
//page
hql="delete from Page p where p.id=?";
this.pageDao.batchEntityByHQL(hql, pid);
}
dao 层
public void batchEntityByHQL(String hql, Object... objects) {
Query query = sf.getCurrentSession().createQuery(hql);
int len=objects.length;
for(int i=0;i<len;i++){
query.setParameter(i, objects[i]);
}
query.executeUpdate();
}
- 生成 sql 语句
两条语句即可
Hibernate:
delete
from
questions
where
pageid=?
Hibernate:
delete
from
pages
where
id=?
结论:
方案一(Hibernate 级联删除 ):
- sql 语句太多
- page.hbm.xml 的配置 lazy=”false”/fetch=”join” ,查询 page 会自动加载(实例化) questions 集合。这个是不错,可是当我只想要查询 单个 page 的时候,就不太好了
方案二( hql编程实现删除 ):
- sql 语句少
- page.hbm.xml 不用配置 lazy=”false”/fetch=”join”,查询page ,是单个page;如果需要在页面显示问题,一定要注意编码实现查询 page 的时候,实例化questions 集合,不然会有懒加载异常。