新手 还没遇到过 在dao层  用sql控制吧  哈哈

解决方案 »

  1.   

    one to many的映射设置cascade=CascadeType.ALL
      

  2.   

    在xxx.hbm.xml中相对的<set cascade="all"></set>
      

  3.   

    在set里面添加属性cascade="all"
    表示级联操作。all代表所有,如增、删、改!
      

  4.   


    你的 person //人员表是主键,那么你就在person //人员表的xxx.hbm.xml的<set name="实体名(person)" inverse="true" cascade="delete">
    cascade="delete">就是级联删除
      

  5.   

    set节点之cascade属性
    all                  : 对所有操作都进行级联
    none                 : 对所有操作都不进行级联
    save-update          : 执行更新操作时级联
    delete               : 执行删除操作时级联
    inverse设为true,由many一方删除
    inverse是“反转”的意思,表示关联关系的控制权。
    为true,表示由对方负责关联关系的添加和删除;
    为false,表示由自己负责维护关联关系最终解决方法是person中的xxx.hbm.xml加上<set name="实体名(person)" inverse="true" cascade="delete"></set>
    然后在email中的也加上<set name="实体名(email)" inverse="true" cascade="delete"></set>简单的说就是在主表的xxx.hbm.xml的<set></set>的属性中加上cascade="delete"它,就可以级联删除删除时候根据person的id来删除,即先查Person的id,在执行删除
    如果这都不是你要的结果,那我也就没办法了
     
      

  6.   

    person是email的主表,而email又是letter的主表
    这样配置是不会违反你的题目意思的
    也就是说在Person中加cascade="delete"只会删除email
    而email中加这个属性也是一样 并且你的三张表都有关系,所以执行就感觉是三张表的数据一起删除
      

  7.   

    这种解决方案在级联删除时,首先hibernate要在缓存中加载person,同时要抓取email、letter(怎么做到?我只能在person中抓取email,但不能抓取letter),这样才可以删除。但性能受到影响。我最后的方法舍弃了hibernate的级联删除,使用程序控制:
    DAO层:
    letterDao,按emailid删除letter
    emailDao,按personid删除email
    personDao,按id删除personService层按id删除一个person的具体操作(调用DAO层):
    (1)查出所拥有的所有eamilid
    (2)对每个eamilid调用letterDao删除letter
    (3)调用personDao删除email
    这样做的好处:
    利用了spring的事务管理,三个步骤有一个出错,则自动回滚,保证数据正确性。
    性能有了很多提高。