在grails中建模多对一树

时间:2014-07-06 18:04:06

标签: grails gorm grails-2.0 grails-domain-class

我试图用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。应该暗示。

谢谢!

2 个答案:

答案 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
  }
}