我正在尝试对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 ,并以您想要的方式建立关系。

07-24 09:37