我在设置两个类之间的关系时遇到一些问题。我有2节课,学生:
class Student {
String name
Guardian father
Guardian mother
Guardian local_guardian
}
和监护人:
class Guardian {
String name;
static hasMany = [children:Student]
static mappedBy = [children:'father']
}
在这里,我使用了appedBy将监护人对象映射到父亲属性。除非我被告知错误,否则不得将mapledBy与3个Student类属性中的任何一个一起使用。
我尝试了此查询以输入一些示例数据
new Student(name:"John", father: new Guardian(name:"Michael").save(),
mother: new Guardian(name:"Mary").save(),
local_guardian: new Guardian(name:"James").save()).save(flush:true);
数据已成功保存,但是我的问题是,由于我将mapedBy与'father'属性一起使用,因此我只能对那个父亲对象使用Guardian.children。
当我尝试获取带有母亲和local_guardian对象的 child 的列表时,
(例如:mother.children)得到空结果。
我尝试通过在许多方面添加addTo
Guardian.findByName("Mary").addToChildren(
Student.findByName("John")).save(flush:true);
并尝试访问
Guardian.findByName("Mary").children
在这里,我得到了结果,但是它将 child 从父亲移到了母亲对象,并且不再能够访问
father.children
我将如何解决这种情况?我要实现的目标是,我应该能够从所有3个Guardian对象中获得子级列表。在这里,一个Student对象指向3个Guardian对象(父亲,母亲,local_guardian)。所以我应该能够得到 child 的名单
我如何在这些类之间设置适当的关系来解决我的问题?
最佳答案
如果要使用hasMany实现此关系,则需要在Guardian类中具有三个mapedBy。
static hasMany = [children:Student, motherChildres:Student, localGuardianChildrens:Student]
static mappedBy = [children:'father', motherChildrens:'mother', localGuardianChildrens: 'local_guardian']
但这看起来并不好,相反,您可以使用中级域类来实现关系,并在Guardian类中添加addToChildren和getChildrens方法,如下所示。
class GuardianChildren {
Guardian guardian
Student student
constraints {
student unique: ['guardian']
}
}
Guardian {
void addToChildrens(Student child) {
new GuardianChildren(guardian:this, student:child).save()
}
@Transient
List<Student> getChildrens() {
return GuardianChildren.findAllByGuardian(this).children
}
}
Student {
@Transient
Guardian getMother() {
//find guardin children where guardian type is mother and children is this student
}
@Transient
Guardian getFather() {..}
}
从监护人中删除hasMany,从学生中删除父亲/母亲的属性(property)。您可能还需要在Guardian中输入类型字段,以指定这是母亲/父亲等