我正在尝试对grails中的组织树进行建模。我的作品行之有效,但是我对此有两个疑问。
这是我的“组织”类(class):
class Organization {
String title
Organization parentOrg
static hasMany = [ childOrg: Organization ]
static mappedBy = [
childOrg: 'parentOrg',
parentOrg: 'childOrg'
]
static constraints = {
parentOrg nullable: true
}
}
现在,当我像这样创建一个新的“组织”时:
def newOrg = new Organization(
title: 'New Organization',
parentOrg: oldOrg).save()
一切正常,与 parent 的关系似乎正确建模。
但是,如果我尝试调用
oldOrg.childOrg.each
之类的东西,除非我也调用oldOrg.addToChildOrg(newOrg)
,否则不会有任何结果。此外,当我检查生成的表时,对此关系的唯一引用是
parent_org_id
表上的Organization
列。现在,我意识到这是确定
childOrg
关系所必需的,但是从调用oldOrg.addToChildOrg(newOrg)
之前到之后,我都没有注意到数据库中的任何更改!因此,当我在数据库中看不到任何变化时调用
addToChildOrg
时,该关系存储在哪里?另外,添加
childOrg
时如何设置此关系以自动创建parentOrg
关系?我认为添加addToChildOrg
时不必调用parentOrg
。应该暗示。谢谢!
最佳答案
使用hasOne
关联将外键引用以一对一的方式存储。
由于您不想每次都添加对方的关系,因此可以创建一个塞特来简化您的工作,例如-
setParentOrg(parentInstance){
this.parentOrg = parentInstance
parentInstance.childOrg = this
}
现在,当您执行
organisationInstance.parentOrg = parentInstance
时,将为您调用 setter ,并以您想要的方式建立关系。