Grails/GORM 中的错误:已删除的对象将被级联重新保存
Posted
技术标签:
【中文标题】Grails/GORM 中的错误:已删除的对象将被级联重新保存【英文标题】:Error in Grails/GORM: deleted object would be re-saved by cascade 【发布时间】:2013-11-26 14:22:24 【问题描述】:看起来这个问题已经被问过很多次了,我已经研究了其中的几个,包括 Peter Led*** 的“GORM Gotchas (Part 2)”,但在我的情况下似乎仍然无法弄清楚。我有一个user
,其中有很多projects
,而project
属于user
。然后有一个skill
,它有许多与之关联的projects
,但project
不属于skill
。当我尝试从user
中删除project
时,我得到了那个错误。领域类如下:
当我如下运行集成测试时,包含foundUser.removeFromProjects(foundProject1)
的部分似乎有问题。
上述测试中的第一个given:... when:... then:...
块验证正常。在第二个when:...
块中,当我尝试从user
中删除project
时,似乎出现了错误。错误看起来像这样......
我正在使用:
Grails 版本:2.3.1 Groovy 版本:2.1.8 JVM版本:1.7.0_45已经花了很多时间寻找一些解决方案,但还没有运气。任何帮助将不胜感激。谢谢!
【问题讨论】:
【参考方案1】:all-delete-orphan
- 仅适用于一对多关联和
表示
当一个孩子从一个关联中移除时,它应该被自动删除
.当
父母是。因此,当您调用 foundUser.removeFromProjects(foundProject1)
时,您正在尝试删除 foundProject1
对象,但无法从数据库中删除它,因为 Skill
实体仍然引用此项目。如何解决:
User
中删除projects cascade: "all-delete-orphan"
以防止在调用user.removeFromProjects(...)
时删除项目
第二种方法:使用保存项目调用skill.removeFromProjects(...)
,以便删除该项目
【讨论】:
谢谢@araxn1d,您的解释简单易懂,而且简洁优雅——第一次尝试就奏效了。这两种方法都工作得很好。就我而言,当我删除project
时,我还希望将其从数据库中删除,因此适用第二种方法。但是感谢您对这两种方式的解释,它提供了一个完整的画面,并且在这种情况下整个事情如何运作更加清晰。从您的解释来看,我似乎也不需要Skill
类中的static mapping = projects cascade: "all-delete-orphan"
,果然我不需要那个!谢谢!
很高兴能帮到你。祝你的 grails 应用程序开发顺利 =)
谢谢,@araxn1d。看起来在我之前的许多尝试中,我尝试过类似于第二种方法的东西。但是,它不起作用,因为我试图删除多个项目,并且我试图首先从他们各自的用户中删除所有项目,然后试图从关联中删除项目,但这不起作用。当我以另一种方式进行时,即首先从关联中删除,然后再从父母中删除,它会起作用。所以顺序似乎很重要,而且现在很有意义。非常感谢您提供清晰简洁的解释!以上是关于Grails/GORM 中的错误:已删除的对象将被级联重新保存的主要内容,如果未能解决你的问题,请参考以下文章
在 Grails (GORM) 中处理并发修改,同时避免过时对象异常