一个Grails域类中的多个多对多关联

时间:2015-09-30 18:39:54

标签: grails gorm grails-3.0

我正在使用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) ;) 为了这个目的。这让我想知道域类的关联是否真的是我应该如何建模这些关系。还有其他我可以做的吗?

2 个答案:

答案 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()])
            }
        }
    }
}