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 级联删除 ):

    1. sql 语句太多
    2. page.hbm.xml 的配置 lazy=”false”/fetch=”join” ,查询 page 会自动加载(实例化) questions 集合。这个是不错,可是当我只想要查询 单个 page 的时候,就不太好了
  • 方案二( hql编程实现删除 ):

    1. sql 语句少
    2. page.hbm.xml 不用配置 lazy=”false”/fetch=”join”,查询page ,是单个page;如果需要在页面显示问题,一定要注意编码实现查询 page 的时候,实例化questions 集合,不然会有懒加载异常。
0 0
原创粉丝点击