Grails GORM很少适用于域类

时间:2012-10-07 21:28:38

标签: hibernate grails

我在用户和组织之间有很多关系。我想在删除用户时删除所有组织中的用户,所以这基本上就是我提出的:

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钩子(以及其他所有钩子)也毫无用处。

1 个答案:

答案 0 :(得分:0)

好的,首先请务必阅读有关删除事件的documentation。您可以看到,对于要在DB中实际反映的任何更改,您需要一个新会话,并且因为在事件内部您已经在使用要删除的当前对象,所以您不需要调用get()方法:

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

(上面的代码尚未经过测试)

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