您的位置:首页 > 移动开发 > Objective-C

解决hibernate 删除异常: deleted object would be re-saved by cascade (remove deleted ob

2013-01-13 22:22 525 查看
在hibernate 删除关联时会出现deleted object would be re-saved by cascade (remove deleted object from associations)的异常,现在网络上解决这个问题的,无非以下这几种



方法1 删除Set方的cascade:(缺点:子对象和父对象不能进行级联更新,没意义)

方法2 解决关联关系后,再删除

onside.getManys().remove(thisMany); //在所关联的一方的set中移走当前要删除的对象

thisMany.setOne(null); //设置所对应的一方为空,解除它们之间的关系

manyDao.delete(thisMany);

方法3 在many-to-one方增加cascade 但值不能是none (缺点:子对象也级联到父对象,难得删除一个学生要把老师也删除?)

方法4 现在我研究出来第四种,更加简单快捷

直接把子对象关联的父对象setNull,然后保存子对象,然后删除子对象,具体看代码


Java代码

thisMany.setOne(null);
Service.update(thisMany);
Service.delete(thisMany);

下边为另一个的博客:

解决办法:

方法1 删除Set方的cascade

方法2 解决关联关系后,再删除 :

方法3 在many-to-one方增加cascade 但值不能是none

以one-To-many为例:

1.如果Many端存在于One端的集合中,直接删除Many,就会抛出"deleted object would be re-saved by

cascade"的异常,解决办法是在One端的集合中先删除Many端(先把他们之间的联系割断),然后再在Hibernate

中删除Many端。

但在JDBC下直接删除Many端是可以的。

2.如果直接删除One端:

A.如果One端中没有设置Cascade为delete或者all,就会抛出“Cannot delete or update a parent row: a

foreign key constraint fails”的异常。在JDBC下也是不行的(在建表时设置 ON DELETE CASCADE除外),因

为Hibernate只是把JDBC下的异常封装而已。

B.如果One端中设置Cascade为delete或者all,删除的时候就会把所有Many端都删除。

其他参考:

在删除的方法中加入这样几句代码就可以了

Orders od=(Orders)session.load(Orders.class,item.getOrderId());

od.getOrderItems().remove(item);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐