【问题标题】:Error in Grails/GORM: deleted object would be re-saved by cascadeGrails/GORM 中的错误:已删除的对象将被级联重新保存
【发布时间】:2013-11-26 14:22:24
【问题描述】:
看起来这个问题已经被问过很多次了,我已经研究了其中的几个,包括 Peter Ledbrook 的“GORM Gotchas (Part 2)”,但在我的情况下似乎仍然无法弄清楚。我有一个user,其中有很多projects,而project 属于user。然后有一个skill,它有许多与之关联的projects,但project 不属于skill。当我尝试从user 中删除project 时,我得到了那个错误。领域类如下:
打包 grailstuts
类用户{
字符串名称
静态约束 = { name(nullable: true) }
静态映射 = { 项目级联:“所有删除孤儿”}
静态 hasMany = [项目:项目]
}
打包 grailstuts
类项目{
字符串标题
静态约束 = { title(nullable: true) }
静态 belongsTo = [用户:用户]
}
打包 grailstuts
类技能{
字符串名称
静态约束 = { name(nullable: true) }
静态映射 = { 项目级联:“所有删除孤儿”}
静态 hasMany = [项目:项目]
}
当我如下运行集成测试时,包含foundUser.removeFromProjects(foundProject1) 的部分似乎有问题。
打包 grailstuts
导入 spock.lang.*
类 SkillIntegrationSpec 扩展规范 {
void "添加和删除项目"() {
给定:“一个用户,以及添加到该用户的项目”
def user = new User().save(failOnError: true)
def project1 = new Project(title: "java, groovy")
def project2 = new Project(title: "java, scala")
user.addToProjects(project1)
user.addToProjects(project2)
何时:“项目也添加到技能条目”
def java = new Skill(name: 'java').save(failOnError: true)
java.addToProjects(project1)
java.addToProjects(project2)
def groovy = new Skill(name: 'groovy').save(failOnError: true)
groovy.addToProjects(project1)
def scala = new Skill(name: 'scala').save(failOnError: true)
scala.addToProjects(project2)
然后:“每个技能条目都有其对应的项目”
Skill.findByName("java").projects.size() == 2
Skill.findByName("groovy").projects.size() == 1
Skill.findByName("scala").projects.size() == 1
何时:“某些项目已从数据库中删除”
def foundUser = User.get(user.id)
def foundProject1 = Project.findByTitle("java, groovy")
foundUser.removeFromProjects(foundProject1)
然后:“被删除的项目也反映在技能条目中”
Skill.findByName("java").projects.size() == 1
Skill.findByName("groovy").projects.size() == 0
Skill.findByName("scala").projects.size() == 1
}
}
上述测试中的第一个given:... when:... then:... 块验证正常。在第二个when:... 块中,当我尝试从user 中删除project 时,似乎出现了错误。错误看起来像这样......
|正在运行 1 个集成测试... 1 of 1
|失败:添加和删除项目(grailstuts.SkillIntegrationSpec)
| org.springframework.dao.InvalidDataAccessApiUsageException:已删除的对象将被级联重新保存(从关联中删除已删除的对象):[grailstuts.Project#2];嵌套异常是 org.hibernate.ObjectDeletedException:已删除的对象将被级联重新保存(从关联中删除已删除的对象):[grailstuts.Project#2]
在 org.grails.datastore.gorm.GormStaticApi.methodMissing_closure2(GormStaticApi.groovy:102)
在 grailstuts.SkillIntegrationSpec.添加和删除项目(SkillIntegrationSpec.groovy:34)
原因:org.hibernate.ObjectDeletedException:已删除的对象将被级联重新保存(从关联中删除已删除的对象):[grailstuts.Project#2]
... 2 更多
|完成 1 次集成测试,1 次在 0m 0s 内失败
|测试失败 - 在 C:\Grails\grailstuts\target\test-reports 中查看报告
我正在使用:
Grails 版本:2.3.1
Groovy 版本:2.1.8
JVM版本:1.7.0_45
已经花了很多时间寻找一些解决方案,但还没有运气。任何帮助将不胜感激。谢谢!
【问题讨论】:
标签:
grails
grails-orm