`

Cascade delete在FitU-Thinking中的解决方法

    博客分类:
  • FitU
阅读更多

在many-to-many/one-to-many中有这样的常规需求:删除一端时只删除对应的关系和本身,当然这个需求在硬编码中实现起来是方便的,但是当在框架中实现,希望得到最高程度的重用的时候,就会遇到一些小麻烦。FitU-Thinking已经解决了这个问题。

以FitU中的app为例(相关代码可以参考),三个Model: Role, UserGroup, User. Role和UserGroup之间存在one-to-many的关系;UserGroup和User之间存在many-to-many的关系。Fitu的CRUD是可以重用,不同的UseCase可以不必写这些累赘的代码。 

先说明Role和UserGroup。我们方便的实现了新增,修改,以及关联,甚至是对UserGroup的删除,但是在我们删除Role的时候遇到了FK问题,当我们将cascade配置成All的时候,删除Role会将其下相关的UserGroup删除,但是往往用户并不希望删除UserGroup,所以单纯的remove(clazz, id)没有办法满足到这种需求,所以扩展了一下:remove(model, id, {"groups", "role"}),只是在Action中必须重新实现remove(要多写几行代码)。

UserGroup和User也是类似的在级联删除的时候遇到了问题,关系是由UserGroup维护的,当删除UserGroup时会自动的将其和User的关系断开,但是当删除User的时候,FK异常又出现了,当然我必须满足级联更新和保存。此时也是需要重新实现remove方法的。

这种先断开关系,再删除对象的功能在Hibernate中实现起来是这样:找出Model中的关系对象集,然后遍历关系对象集将其中的model对象(或对象集)设空,这样就实现了关系断开,然后再调用remove(modelClass, id),就可以将Model删除了,而不会遇到FK冲突。详细实现可以参看ThinkingService.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics