grails belongsTo映射到另一个类的属性

时间:2017-02-18 15:02:50

标签: grails gorm

当子类可能属于父类中的两个属性之一(但不是两者)时,我无法理解Grails中belongsTo - hasMany关系的概念。

例如:

class Store {
    Integer storeNumber
    List employees
    List managers

    static hasMany = [employees:Person,
                      managers:Person]
}

class Person {
    String name
    String roll

    static belongsTo = [store:Store]

    static constraints = {
        role inList: ['employee','manager']
    }
}

Person位于Store.employees列表或Store.managers列表

我在“映射中重复列...”的人身上收到错误。我尝试了一些静态映射尝试,但仍然不了解如何正确地执行它。

如何正确映射?

提前致谢....

1 个答案:

答案 0 :(得分:1)

class Store {
    Integer storeNumber
    //List employees
    //List managers

    static hasMany = [employees:Person,
                      managers:Person]
    static constraints = {
      employees(nullable:true)
      managers(nullable:true)
    }
}

class Person {
    String name
    String roll

    static belongsTo = [store:Store]

    static constraints = {
        role inList: ['employee','manager']
    }
}

现在添加商店

Store store = new Store(storeNumber: 1).save()
if (store) {
  Person person = new Person(name:'fred', roll:'employee', store:store).save()
  if (person) {
    store.addToEmployees(person)
  }
}

因此,头痛的好处显然是反向查找父母的一种快速方式,另一种是下面描述的松散关系,它不关心父母,所以你不需要这最后一点,显然放松了依赖性问题,你打到目前为止

结束E2A

你需要一个人拥有另一种关系

或者,如果您不关心belongsTo关系,那么事情会更容易

static belongsTo = Store

那个因素不再是问题。

区别在于您使用的当前方法与我向您展示的后一种方法 - 如果从子项开始查询,您可以轻松地从子项反向步行回到父级

无论哪种方式,您始终可以从父级开始查询,然后加入子级并查找子级方面

所以你先生的套房

最终修改 你知道当你多年来一直在做这些事情时,你会找到以其他方式做事的方法:

让我们假设您确实设置了从Parent到Child的松散/弱引用,并且您想要访问Parent。方法如下:

Class User {
     String username
    static hasMany=[childs:Children]
}

Class Children {
    String firstName
    static belongsTo=User

   // now to get access back to parent user without knowing parent a hackish thing like this can be done:

    User getUser() {
        User.findByChilds(this)
    }
    String getUserName() {
        return user?.username
    }

}

现在从一个孩子你可以做$ {instance.user}或$ {instance.userName}然后这将绑定回到父对象并通过子对象本身找到findByChilds(this)多年前我想这会让我感到歪曲