我在用户和组织之间有很多关系。我想在删除用户时删除所有组织中的用户,所以这基本上就是我提出的:
class User {
...
def beforeDelete() {
def user = User.get(id)
Organization.all.each {
it.removeFromMembers(user)
it.save()
}
}
}
这令人惊讶地不起作用,因为User.get(id)
返回null,即使具有给定id的用户在数据库中,当我查看日志时,甚至没有执行sql语句。
所以我尝试使用load()
方法。然后是ObjectNotFoundException。所以我尝试了这个,因为我非常绝望:
def user = User.find("from User as u where u.id = ?", [1L])
由于某种原因,这是有效的。但现在,it.removeFromMembers(user)
行会抛出NullPointerException。
我试图将这个逻辑放在我的UserController中,它可以工作!
这是为什么?为什么我不能在域类中这样做?这使得beforeDelete
钩子(以及其他所有钩子)也毫无用处。
答案 0 :(得分:0)
好的,首先请务必阅读有关删除事件的documentation。您可以看到,对于要在DB中实际反映的任何更改,您需要一个新会话,并且因为在事件内部您已经在使用要删除的当前对象,所以您不需要调用get()
方法:
def beforeDelete() {
User.withNewSession {
organizations.each{ org ->
org.removeFromMembers(this)
}
this.save()
}
}
(上面的代码尚未经过测试)
get()
方法中为空的原因是因为触发事件时id
不存在。如果要访问id,则必须从当前对象中检索它:this.id