Hibernate 级联删除 和 hql编程实现删除 的比较
来源:互联网 发布:照片模糊修复软件 编辑:程序博客网 时间:2024/06/06 02:03
需求
在删除页面的同时,删除相对应的问题
实体关联关系:
方案一(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"
- 主要删除方法代码
@Testpublic 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编程实现删除):
- 主要删除方法代码
@Testpublic 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 集合,不然会有懒加载异常。
0 0
- Hibernate 级联删除 和 hql编程实现删除 的比较
- Hibernate实现级联删除
- Hibernate实现级联删除
- Hibernate的级联删除
- Hibernate的级联删除
- 删除级联hibernate级联删除
- 有关Hibernate的级联删除
- hibernate 级联删除的问题
- hibernate级联删除的注意事项
- 关于hibernate的级联删除
- hibernate的级联删除特性
- hibernate的注解方式如何实现级联删除
- hibernate中用hql实现查找、删除、更新
- Hibernate级联删除
- Hibernate 级联删除
- hibernate级联删除问题
- hibernate级联删除
- Hibernate 级联删除
- linux 内核修改分辨率后出现的WARNING解决方法
- 蓝桥杯 算法训练 矩阵相乘
- DarkZone API http短连接通讯模块dzQuery.js各功能呢个使用方法
- Job Dependencies
- Spring入门2--aware接口
- Hibernate 级联删除 和 hql编程实现删除 的比较
- Binary Tree Level Order Traversal
- 最新活动介绍,看过选过不错过
- android实现类似在短信图标右上角显示短信个数的效果
- 基于Twemproxy的Redis集群方案
- 【Maven】maven配置默认使用的JDK版本
- OpenCV图像的轮廓的匹配
- CA framwork
- 第4周项目2-分数类的雏形