[英]grails domain class multiple circular reference issue
如下所示,域是其自身的属性:
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
}
以上支持者具有OPS角色,我们也为此添加了验证。 总体支持者不属于原始Manager>Leader>Developer hierarchy
。
现在,当我创建几个子组对象时,说MANAGER_RAD > LEAD_BAD ->( DEV_JACK and DEV_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()
现在,当我们尝试按以下方式获取管理者的孩子时(例如在引导程序中):
Group manager = Group.findByName('MANAGER_RAD')
println "------Manager team members---->$manager.children"
println "------supporters for Manager---->$manager.supporters"
预期的输出是:
------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_id列。
为了克服这种情况,您可以使用mappedBy并指定要绑定到属性名称的children和supporters属性的属性名称。
更改后,您的域类将如下所示:
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将为您生成两个表: groups和groups_groups 。 如果您要跳过其中一个属性的mappedBy ,则该属性将绑定到组表中的“ boss_id ”列。
groups_groups表的结构为:
+-------------------+----------+---------------------+
| group_children_id | group_id | group_supporters_id |
+-------------------+----------+---------------------+
有关更多说明,请参见https://grails.github.io/grails-doc/latest/guide/GORM.html#domainClasses 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.