异常:deleted object would be re-saved by cascade (remove deleted object from associations)

在做课程设计的时候:出现deleted object would be re-saved by cascade (remove deleted object from associations)的异常。后来查资料得出下列结论:

以many-to-one为例:

     一、如果按常规过程删除many端的对象,则会出现deleted object would be re-saved by cascade (remove deleted object from associations)的异常。        

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

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

中删除Many端。

           解决:网上有四种方法

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

方法2 解决关联关系后,再删除
    onside.getManys().remove(thisMany);   //在所关联的一方的set中移走当前要删除的对象
    thisMany.setOne(null);                          //设置所对应的一方为空,解除它们之间的关系
    manyDao.delete(thisMany);

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

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

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

Java代码
  1. thisMany.setOne(null);
  2. Service.update(thisMany); 
  3. Service.delete(thisMany); 

 

         我最终的解决办法:先把many端的对象从one端的set集合中移除,然后再删除many一端的对象

faculty=(Faculty) session.load(Faculty.class,new Integer(classroom2.getFaculty().getId()));
                     faculty.getClassroom().remove(classroom2);

                     session.delete(classroom2);

二、

    .如果直接删除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端都删除。

 

你可能感兴趣的:(异常:deleted object would be re-saved by cascade (remove deleted object from associations))