首页 > 代码库 > HIbernate 级联删除

HIbernate 级联删除

在一对多的情形下如 Cinema - > Screen;

1、正常在不设置级联(casCade)的情况下 删除一的一方(Cinema)会报外键关联 异常 Screen 中包含Cinema的外键;

这个时候可以先取出Cinema中的所有Screen集合后在删除所有的Screen, 完毕后在删除 Cinema 这样就ok;

2、但是在设置了级联的情形下,在一的一方Cinema中设置了CascadeType.ALL后(这样在保存一个Cinema的时候方便保存所有的Screen),在

按照上面的方法删除多的一方Screen就会报错了 deleted object would be re-saved by cascade 

解决办法:

方法1 删除Set方的cascade:也就是取消Cinema中设置的CascadeType.ALL 这样失去了意义
方法2 解决关联关系后,再删除(从一方取出多方后删除,并将多方的外键设为null,在对多方删除 )

    onside.getManys().remove(thisMany);   //在所关联的一方的set中移走当前要删除的对象
    thisMany.setOne(null);                          //设置所对应的一方为空,解除它们之间的关系
    manyDao.delete(thisMany);
方法3 在many-to-one方增加cascade 但值不能是none ,这样在对多的一方Screen做一些操作的时候可能影响到一方(不可取)

其中方法2可取:

HIbernate 级联删除