0

私はユーザーと組織の間に多対多の関係を持っています。ユーザーが削除されているときに、彼のすべての組織からユーザーを削除したいので、これは基本的に私が思いついたものです:

class User {
    ...

    def beforeDelete() {
        def user = User.get(id)
        Organization.all.each {
            it.removeFromMembers(user)
            it.save()
        }
    }
}

指定されたIDのユーザーがデータベースに存在していてもnullを返すため、これは驚くほど機能しませんUser.get(id)。ログを見ると、SQLステートメントも実行されていません。そこで、load()メソッドinstedを使ってみました。その場合、ObjectNotFoundExceptionが結果になります。それで私はかなり必死だったのでこれを試しました:

def user = User.find("from User as u where u.id = ?", [1L])

これは、何らかの理由で機能します。しかし今、この行it.removeFromMembers(user)はNullPointerExceptionをスローします。

このロジックをUserControllerに入れようとしましたが、機能します。

どうしてこれなの?ドメインクラスでこれを実行できないのはなぜですか?これにより、beforeDeleteフック(および他のすべてのものも)はかなり役に立たなくなります。

4

1 に答える 1

0

まず、削除イベントに関するドキュメントを必ずお読みください。変更が実際にDBに反映されるためには、新しいセッションが必要であることがわかります。イベント内では、削除する現在のオブジェクトを既に操作しているため、get()メソッドを呼び出す必要はありません。

def beforeDelete() {
  User.withNewSession {
     organizations.each{ org -> 
        org.removeFromMembers(this)
     }
     this.save()
  }
}

(上記のコードはテストされていません)

get()メソッドにnullがある理由idは、イベントが発生したときに存在しないためです。IDにアクセスする場合は、現在のオブジェクトからIDを取得する必要があります。this.id

于 2012-10-07T23:56:51.633 に答える