2011-07-24 7 views
3

で双方向の関係なしに削除されます。カスケードは、私はGrailsの1.3.7を使用して、以下のドメインクラスを持っていますGrailsの

package com.fxpal.test 

class UserGroup { 

    String name 

    static constraints = { 
     name(blank: false) 
    } 
} 

class Invitation { 

    UserGroup group 
    String user 

    static belongsTo = [group: UserGroup] 

    static constraints = { 
     group(nullable: false) 
    } 
} 

私はのUserGroupインスタンスを参照するすべての招待インスタンスを削除できるようにしたいと思いますそのUserGroupインスタンスは削除され、UserGroupのInvitationを参照する明示的な関係はありません。言い換えれば、グループを変更せずに、UserGroupからInvitationにカスケード削除をしたいと思います。このため

私のテストが原因招待を表し制約に失敗した - >のUserGroupの関係:私はテストを実行すると

void testCascadingDelete() { 
    UserGroup group1 = new UserGroup(name: 'group1').save(flush: true, failOnError: true) 
    UserGroup group2 = new UserGroup(name: 'group2').save(flush: true, failOnError: true) 

    Invitation invitation = new Invitation(user:'user1', group: group1).save(flush: true, failOnError: true) 

    assertEquals("Wrong number of groups.", 2, UserGroup.count()) 
    assertEquals("Wrong number of invitations.", 1, Invitation.count()) 

    group1.delete(flush: true, failOnError: true) 

    assertEquals("Wrong number of groups.", 1, UserGroup.count()) 
    assertEquals("Wrong number of invitations.", 0, Invitation.count()) 
} 

、それは次のように失敗します。

could not delete: [com.fxpal.test.UserGroup#1]; SQL [delete from user_group where id=? and version=?]; constraint [FK473F7799A8642225]; nested exception is org.hibernate.exception.ConstraintViolationException: could not delete: [com.fxpal.test.UserGroup#1] 
org.springframework.dao.DataIntegrityViolationException: could not delete: [com.fxpal.test.UserGroup#1]; SQL [delete from user_group where id=? and version=?]; constraint [FK473F7799A8642225]; nested exception is org.hibernate.exception.ConstraintViolationException: could not delete: [com.fxpal.test.UserGroup#1] 
    at com.fxpal.test.InvitationIntegrationTests.testCascadingDelete(InvitationIntegrationTests.groovy:23) 
Caused by: org.hibernate.exception.ConstraintViolationException: could not delete: [com.fxpal.test.UserGroup#1] 
    at com.fxpal.test.InvitationIntegrationTests.testCascadingDelete(InvitationIntegrationTests.groovy:23) 
    ... 

それはのように思えます正規の鼻顔の例ですが、カスケード削除は機能していないようです。私は本当にUserGroupのInvitationを表現する必要はありません。特に、最終的にInvitationはいくつかの他のドメインクラスを参照するため、削除すると対応するInvitationも削除されるはずです。

私には何が欠けていますか?

遺伝子

答えて

5

私はそれが双方向関係なく可能だかどうかわからないんだけど、あなたは簡単にトランザクションサービスメソッド(必ず削除がすべて起こるか何も起こらないことを確認するために)でそれを自分で行うことができます。

void deleteGroup(UserGroup group) { 
    Invitation.executeUpdate(
     'delete from Invitation where group=:group', 
     [group: group]) 
    group.delete(flush: true, failOnError: true) 
} 

してからテストを

def fooService 

... 

void testCascadingDelete() { 
    UserGroup group1 = new UserGroup(name: 'group1').save(flush: true, failOnError: true) 
    UserGroup group2 = new UserGroup(name: 'group2').save(flush: true, failOnError: true) 

    Invitation invitation = new Invitation(user:'user1', group: group1).save(flush: true, failOnError: true) 

    assertEquals("Wrong number of groups.", 2, UserGroup.count()) 
    assertEquals("Wrong number of invitations.", 1, Invitation.count()) 

    fooService.deleteGroup group1 

    assertEquals("Wrong number of groups.", 1, UserGroup.count()) 
    assertEquals("Wrong number of invitations.", 0, Invitation.count()) 
} 

マイナー無関係なノートのカップルになり - プロパティは、デフォルトでは、nullではないので、あなたはを削除することができます制約。そしてその名前の変数を定義しているようにマップフォームにbelongsToがあるので、InvitationUserGroup groupを省略することができます。

UPDATE:

別控えめオプションはUserGroupで前-削除イベントを使用することです:迅速な対応、バートのための

def beforeDelete() { 
    Invitation.executeUpdate(
     'delete from Invitation where group=:group', 
     [group: this]) 
} 
+0

ありがとう! Invitationがそのコンテキスト(例えば、招待状を発行しているユーザー)として使用する可能性のある他のすべてのクラスに対して、そのようなメソッドが存在することを確認する必要があるので、私はdeleteGroup()スタイルのソリューションを避けることを望んでいました。しかたがない。 –

+0

'belongsTo'のプロパティを複製するまでは、意図的にSpringSource Tool Suite(Eclipse)がクラス内のプロパティを認識して構文補助を行うことを許可しました。 –

+0

私はより軽量なオプションで答えを更新しました。それでもなお余分なコードが必要ですが、ドメインクラスに含まれています。 –

関連する問題