我在设置两个类之间的关系时遇到一些问题。我有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 的名单
  • Father.children
  • mother.children
  • local_guard.children

  • 我如何在这些类之间设置适当的关系来解决我的问题?

    最佳答案

    如果要使用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中输入类型字段,以指定这是母亲/父亲等

    10-05 18:50