我在SSH集成项目中做订单管理那块的时候,想实现删除订单的时候级联删除下面的订单项,但是我方法都试完了总要报deleted object would be re-saved by cascade (remove deleted object from association
这个错误,我的配置文件级联设置也设置成了cascade=all了的,这到底是为什么呢,我记得当时学习hibernate的时候能实现啊,为什么现在就不能实现了,就一个简单的删除,我也试过把order和orderitem的关系解除,再删除order,那样效果是order确实删除了,但是order对应的orderitem没有删除,只是把orderitem的外键orderid设置成了空,这几天就为了这个以为简单的东西头都搞大了,在网上也搜了很多,还是没能解决我的问题,什么设置lazy=true,什么把缓存session清空,都试了的,就是不行,我就纳闷了,这是为什么,难道只有解除关系,删除了order后在依次把它下面的orderitem遍历删除?这不太麻烦了,如果真是只有这样那么设置cascade=all意义又何在呢,求高手解答!!!贴下片段配置和action代码。
order的映射文件片段:
<set lazy="true" name="orderItems" cascade="all" inverse="true">
<key column="order_id"></key>
<one-to-many class="OrderItem"/>
</set>
orderitem的映射文件片段:
<many-to-one   name="order" column="order_id" class="Order" cascade="all"   ></many-to-one>
action执行的方法:
public String delete(){
Order order=orderBiz.findOrderById(id);
type=order.getOrderType();
User user=order.getUser();
user.removeOrder(order);//解除与user的关系
//order.removeAll();
orderBiz.remove(order);
display();
return "ok";
}
再次恳请高手给予小弟解答,咱们共同探讨共同学习!

解决方案 »

  1.   

    一端:
    将多端的传播持久性(级联)设置为最全面的全部级联:cascade="all-delete-orphan"
    将维护关系的控制权交给多端:inverse="true"多端:
    多端对一端采取了预先抓取策略:fetch="join"
    将一端的传播持久性(级联)设置为存储、更新:cascade="save-update" 
      

  2.   

    inverse这个属性设置对吗   orderitem这个表是不是还关联其它的表?
      

  3.   

    非常感谢3楼的提醒,还确实是那么回事,orderitem还确实与产品关联了的,哎,我也这是帮别人做模块,人家写了一部分我再写的,没有注意那么多!教训啊,以后如果做整个模块,最好从头到尾都有自己写,不然麻烦!就这么一个简单的错误害我停滞了一天,还漫天到处询问,都不好意思了!
    再次感谢楼上各位的回复