在一对多的情形下如 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 这样失去了意义
方法3 在many-to-one方增加cascade 但值不能是none ,这样在对多的一方Screen做一些操作的时候可能影响到一方(不可取)
方法2 解决关联关系后,再删除(从一方取出多方后删除,并将多方的外键设为null,在对多方删除 )
onside.getManys().remove(thisMany); //在所关联的一方的set中移走当前要删除的对象
thisMany.setOne(null); //设置所对应的一方为空,解除它们之间的关系
manyDao.delete(thisMany);
其中方法2可取;