我正在使用Grails 3.0.6,并且正在努力应对复杂且高度互联的域模型。我有与其他类有多个多对多关联的类,我别无选择,只能在至少一个类上有多个belongsTo关联。我无法弄清楚代表这一点的语法。
我的域模型非常复杂,但我能够将问题简化为这个简化的示例:
class Graph {
static hasMany = [vertices: Vertex]
}
class OtherClass {
static hasMany = [vertices: Vertex]
}
class Vertex {
static hasMany = [graph: Graph, other: OtherClass]
}
在这个简化的例子中,我可以通过声明Graph和OtherClass上的域类之间的所有权来解决问题...在我复杂的域模型中,我没有这个选择,因为有太多的类有多个多对多关联。
我试过这个:
class Vertex {
static hasMany = [graphs: Graph, others: OtherClass]
static belongsTo = Graph, OtherClass
}
但是我得到了NPE。
我试过这个:
class Vertex {
static hasMany = [graphs: Graph, others: OtherClass]
static belongsTo = [graphs: Graph, others: OtherClass]
}
但我仍然得到" GrailsDomainException:没有在域类[Graph]和[Vertex]"
之间定义的所有者我能用mappedBy做些什么来正确表示这个吗?
在我的多对多协会中,实际上并不想要级联保存(尽管他们不会受到伤害),所以我不需要属于(或者#34;所有者&#34) ;) 为了这个目的。这让我想知道域类的关联是否真的是我应该如何建模这些关系。还有其他我可以做的吗?
答案 0 :(得分:3)
根据Burt Beckwith的评论,我创建了一个额外的域类来表示连接表。现在,一个多对多关联被分解为两个一对多关联,并且不会出现问题。
示例:
class Graph {
static hasMany = [graphVertexRelations: GraphVertexRelation]
}
class OtherClass {
static hasMany = [vertices: Vertex]
}
class Vertex {
static hasMany = [graphVertexRelations: GraphVertexRelation, others: OtherClass]
static belongsTo = OtherClass
}
class GraphVertexRelation {
static belongsTo = [graph: Graph, vertex: Vertex]
static GraphVertexRelation create(Graph graph, Vertex vertex, boolean flush = false) {
new GraphVertexRelation(graph: graph, vertex: vertex).save(flush: flush, insert: true)
}
}
答案 1 :(得分:0)
您看到"GrailsDomainException: No owner defined between domain classes [Graph] and [Vertex]"
的例外情况意味着ORM无法弄清楚基类是什么,并且Graph和Vertex之间存在周期性关系。
如果您想维持关系以查看“顶点图”是什么,您可以使用条件进行向后查找。
class Graph {
static hasMany = [vertices: Vertex]
}
class OtherClass {
static hasMany = [vertices: Vertex]
}
class Vertex {
static transients = ['graphs']
static hasMany = [other: OtherClass]
List<Graph> getGraphs() {
// Backwards link, using the graph table
Graph.withCriteria() {
vertices {
inList("id", [this.id.toLong()])
}
}
}
}