これは以前に何度も尋ねられたようで、Peter Ledbrook による「GORM Gotchas (Part 2)」を含むいくつかを調べましたが、私の場合はまだ理解できないようです. user
多くの を持っているがprojects
あり、project
は に属していuser
ます。次に、skill
多くのprojects
関連付けられた がありますが、project
は に属しませんskill
。project
aから aを削除しようとすると、user
そのエラーが発生します。ドメイン クラスは次のとおりです。
パッケージ grailstuts クラスユーザー{ 文字列名 静的制約 = { name(nullable: true) } static mapping = { プロジェクト カスケード: "all-delete-orphan" } static hasMany = [ プロジェクト: プロジェクト ] }
パッケージ grailstuts クラスプロジェクト{ 文字列のタイトル 静的制約 = { title(nullable: true) } 静的属し = [ユーザー: ユーザー] }
パッケージ grailstuts クラススキル{ 文字列名 静的制約 = { name(nullable: true) } static mapping = { プロジェクト カスケード: "all-delete-orphan" } static hasMany = [ プロジェクト: プロジェクト ] }
次のように統合テストを実行すると、含まれている部分foundUser.removeFromProjects(foundProject1)
に問題があるようです。
パッケージ grailstuts import spock.lang.* class SkillIntegrationSpec は仕様を拡張します { void "プロジェクトの追加と削除"() { 与えられた:「ユーザー、およびユーザーに追加されたプロジェクト」 def user = new User().save(failOnError: true) def project1 = 新しいプロジェクト(タイトル: "java, groovy") def project2 = 新しいプロジェクト(タイトル: "java, scala") user.addToProjects(project1) user.addToProjects(project2) when: 「プロジェクトもスキルのエントリに追加されます」 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("グルーヴィー").projects.size() == 1 Skill.findByName("スカラ").projects.size() == 1 when: 「一部のプロジェクトがデータベースから削除されました」 def foundUser = User.get(user.id) def foundProject1 = Project.findByTitle("java, groovy") foundUser.removeFromProjects(foundProject1) その後:「削除されたプロジェクトもスキルエントリに反映されます」 Skill.findByName("java").projects.size() == 1 Skill.findByName("グルーヴィー").projects.size() == 0 Skill.findByName("スカラ").projects.size() == 1 } }
上記のテストの最初のgiven:... when:... then:...
ブロックは問題なく検証されます。からwhen:...
を削除しようとしたときの 2 番目のブロックで、エラーが発生したようです。エラーは次のようになります...project
user
| | 1 つの統合テストを実行しています... 1/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 つの統合テストを完了、0m 0s で 1 つ失敗 | | テスト失敗 - C:\Grails\grailstuts\target\test-reports でレポートを表示
私は使っている:
Grails バージョン: 2.3.1 Groovy バージョン: 2.1.8 JVM バージョン: 1.7.0_45
解決策を探すのにかなりの時間を費やしましたが、まだ運がありません。どんな助けでも大歓迎です。ありがとうございました!