0

我在用户和组织之间有多对多的关系。当用户被删除时,我想从他的所有组织中删除用户,所以这基本上是我想出的:

class User {
    ...

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

这令人惊讶地不起作用,因为User.get(id)即使具有给定 id 的用户在数据库中也会返回 null,当我查看日志时,甚至没有执行任何 sql 语句。所以我尝试使用load()方法 insted。ObjectNotFoundException 就是结果。所以我尝试了这个,因为我非常绝望:

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

出于某种原因,这很有效。但是现在,带有it.removeFromMembers(user)throws NullPointerException 的行。

我试图把这个逻辑放在我的 UserController 中并且它有效!

为什么是这样?为什么我不能在域类中这样做?这使得beforeDelete钩子(以及所有其他的)非常无用。

4

1 回答 1

0

好吧,首先一定要阅读有关删除事件的文档。您可以看到,要使任何更改实际反映在数据库中,您需要一个新会话,并且由于在事件内部您已经在处理要删除的当前对象,因此您不需要调用该get()方法:

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

(以上代码未经测试)

您在方法中有 null 的原因get()是因为id在触发事件时不存在。如果要访问 id,则必须从当前对象中检索它:this.id

于 2012-10-07T23:56:51.633 回答