我正在尝试在Grails中实现Subpage域类,我希望Subpage可以存储另一个Subpage。我正在阅读thisthis帖子,但是这些解决方案似乎都不适合我。

我的课看起来像这样:

class Subpage implements Comparable{

    String title
    Integer orderOfSubpage
    SortedSet subpageChild

    static hasMany = [component: Component, subpageChild: Subpage]
    static belongsTo = [domain: Domain, subpageParent: Subpage]

    static constraints = {
        orderOfSubpage nullable:false;
        subpageParent nullable:true;
        subpageChild nullable:true;
    }

        @Override
    public int compareTo(Object o) {
        if (this.orderOfSubpage > o.orderOfSubpage) {
            return 1;
        } else if (this.orderOfSubpage < o.orderOfSubpage) {
            return -1;
        }
        return 0;
    }
}

根据实现,我期望Hibernate创建带有子项的附加表,但是我已经研究了数据库,关于子页面的子页面的唯一“提法”是SUBPAGE表中的SUBPAGE_PARENT_ID列。使用这样的解决方案,我猜(或者我错过了一些事情……),我将不得不遍历整个表来获取所有 child 。

关键点:我该如何实现这一点,以使Subpage类有可能获得所有子级?

提前致谢。

最佳答案

我已经使用了您的域并进行了一些修改。为了简洁起见,我省略了compareTo方法。请注意,不需要SortedSet subpageChild。它已经是一个SortedSet。我也将其重命名为subpageChildren,因为它应该是复数形式。

class Subpage implements Comparable{

    String title
    Integer orderOfSubpage

    static hasMany = [component: Component, subpageChildren: Subpage]
    static belongsTo = [domain: Domain, subpageParent: Subpage]

    static constraints = {
        orderOfSubpage nullable:false;
        subpageParent nullable:true;
        subpageChild nullable:true;
    }
}

因此,让我们看一些代码:
def subpage = new Subpage(title: "Subpage 1", orderOfSubpage: 1)
def child1 = new Subpage(title: "Subpage child 1", orderOfSubpage: 1)
def child2 = new Subpage(title: "Subpage child 2", orderOfSubpage: 2)
subpage.addToSubpageChildren(child1)
subpage.addToSubpageChildren(child2)
subpage.save()

我们创建了一个有2个 child 的子页面。现在,让我们看一下查询的样子:
def subpage = Subpage.findByTitle("Subpage 1")

现在,让我们遍历其子级
subpage.subpageChildren.each { child ->

}

基本上就是这样。只需要一张桌子。

10-07 17:08