我试图用grails模拟组织树。我有什么作品,但我有几个问题。
这是我的'组织'类:
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()
一切运作良好,与父母的关系似乎正确建模。
但是,如果我尝试拨打类似oldOrg.childOrg.each
的内容,除非我还调用了oldOrg.addToChildOrg(newOrg)
,否则我将无法获得任何结果。
此外,当我检查生成的表时,对此关系的唯一引用是parent_org_id
表上的Organization
列。
现在,我意识到这也是确定childOrg
关系所必需的,但在我致电oldOrg.addToChildOrg(newOrg)
之前,我没有注意到数据库中的任何变化!
当我在没有看到数据库中的任何变化时调用addToChildOrg
时,这种关系会存储在哪里?
另外,如何在添加childOrg
时将此关系设置为自动创建parentOrg
关系?当我添加addToChildOrg
时,我认为我不应该拨打parentOrg
。应该暗示。
谢谢!
答案 0 :(得分:2)
使用hasOne
关联以双向一对一的方式存储外键引用。
由于您不希望每次都从其他方面添加关系,因此您可以制作一个设置工具来简化您的工作,例如 -
setParentOrg(parentInstance){
this.parentOrg = parentInstance
parentInstance.childOrg = this
}
现在当你执行organisationInstance.parentOrg = parentInstance
时,会为你调用setter,并按照你想要的方式设置关系。
答案 1 :(得分:0)
如果我是正确的,那么你缺少 belongsTo 定义,因为你需要定义组织的每个实例都由其parentOrg实例拥有。
尝试此类声明:
class Organization {
String title
Organization parentOrg
static belongsTo = [parentOrg: Organization]
static hasMany = [ childOrg: Organization ]
static mappedBy = [ childOrg: 'parentOrg']
static constraints = {
parentOrg nullable: true
}
}