繁体   English   中英

Grails GORM在域类中很少起作用

[英]Grails GORM rarely works in domain classes

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

class User {
    ...

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

这出奇地行不通,因为即使具有给定id的用户在数据库中, User.get(id)返回null,当我查看日志时,甚至没有执行sql语句。 因此,我尝试使用insted的load()方法。 然后是ObjectNotFoundException。 所以我很绝望地尝试了这个:

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

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

我试图将这种逻辑放入UserController中,并且可以正常工作!

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

好吧,首先请确保阅读有关delete事件的文档 您可以看到,要使任何更改真正反映到数据库中,您都需要一个新会话,并且由于在事件内部您已经在使用要删除的当前对象,因此无需调用get()方法:

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

(以上代码尚未经过测试)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM