[英]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.