Java grails域类多循环引用问题

Java grails域类多循环引用问题,java,hibernate,grails,gorm,grails-2.0,Java,Hibernate,Grails,Gorm,Grails 2.0,有一个域已成为其自身财产的情况,如下所示: Group{ String name Role role static belongsTo=[boss:Group] static hasMany=[children:Group,supporters:Group] } static constraint={ boss nullable:true supporters validator: {supporters, group->

有一个域已成为其自身财产的情况,如下所示:

Group{
    String name
    Role role
    static belongsTo=[boss:Group]
    static hasMany=[children:Group,supporters:Group]
}

static constraint={
     boss nullable:true
     supporters validator: {supporters, group->
            supporters?.each {Group supplier ->
                if(!(supporters.role == Role.OPS)){
                    return "domain.not.supporters.object"
                }
            }
            return true
        }
}
}

Role{
   MANAGER,LEADER,DEVELOPERS,OPS
}
以上的支持者都是角色运营,我们也为其添加了验证。总体支持者不属于原始的
Manager>Leader>Developer层次结构

现在,当我创建一些子组对象时,比如
MANAGER\u RAD>LEAD\u BAD->(DEV\u JACK和DEV\u MOHAN)
,支持者只提供给经理。下面的代码将帮助您理解该场景:

Group manager = new Group(name:'MANAGER_RAD')
manager.addToSupporters(new Group(name:'OPS_BISK').save(flush:true))
manager.addToSupporters(new Group(name:'OPS_BAHADUR').save(flush:true))
Group lead = new Group(name:'LEAD_BAD').save(flush:true)
lead.addToChildren(new Group(name:'DEV_JACK').save(flush:true))
lead.addToChildren(new Group(name:'DEV_MOHAN').save(flush:true))
lead.save(flush:true)
manager.addToChildren(lead)
manager.save()
现在,当我们尝试按如下方式获取manager的子项时(在引导程序中说):

预期产出为:

------Manager team members---->[LEAD_BAD(id:2)]
------supporters for Manager---->[OPS_BAHADUR(id:7),OPS_BISK(id:7)]
但返回的输出是:

------Manager team members---->[LEAD_BAD(id:2),OPS_BAHADUR(id:7),OPS_BISK(id:7)]
------supporters for Manager---->[LEAD_BAD(id:2),OPS_BAHADUR(id:7),OPS_BISK(id:7)]
如何获得预期的输出


任何帮助都是值得的。

由于您的代码具有自引用属性(boss)以及相同类型的两个不同关联属性,Grails无法创建正确的模式

从Grails文档:

有时,您可能会发现自己的域类 同一类型的多个属性。他们甚至可能是 自引用,即关联属性的类型与 它所在的域类。这种情况可能会导致问题,因为 Grails可能会错误地猜测关联的类型

在您的例子中,Grails生成一个表,您的子级和支持者属性被绑定到模式中的boss\u id

要克服这种情况,可以使用mappedBy并为要绑定到属性名称的子属性和支持者属性指定属性名称

更改后,您的域类将如下所示:

class Group {
    String name
    Role role

    static belongsTo = [boss: Group]
    static hasMany = [children: Group, supporters: Group]

    static mapping = {
        table 'groups'
    }

    static mappedBy = [children  : "none",
                       supporters: "none"]

    static constraints = {
        boss nullable: true
        role nullable: true
        supporters validator: { supporters, group ->
            supporters?.each { Group supplier ->
                if (supporters.role != Role.OPS) {
                    return "domain.not.supporters.object"
                }
            }
            return true
        }
    }

}

enum Role {
    MANAGER, LEADER, DEVELOPERS, OPS
}
现在Grails将为您生成两个表:组和组\u组。 如果您将跳过任一属性的mappedBy,则该属性将绑定到表中的“boss\u id”列

组的结构\u组的结构为:

+-------------------+----------+---------------------+
| group_children_id | group_id | group_supporters_id |
+-------------------+----------+---------------------+

有关更多说明,请参阅。

您可能缺少
mappedBy
属性。看。我也尝试过mappedBy,但没有成功。很高兴看到我是对的(通过您接受建议使用
mappedBy
属性的答案进行猜测):-)
+-------------------+----------+---------------------+
| group_children_id | group_id | group_supporters_id |
+-------------------+----------+---------------------+