包含自身的Grails域类

时间:2014-01-08 00:40:48

标签: hibernate grails

我正在尝试在Grails中实现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列。使用这样的解决方案,我不得不迭代整个表来获得所有孩子,我猜(或者我想念一些东西......)。

说到这一点:我如何实现这一点以获得一个可以让所有孩子获得的Subpage课程?

提前致谢。

2 个答案:

答案 0 :(得分:2)

我已经采取了你的域并修改了一些东西。为简洁起见,省略了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个孩子的子页面。现在,让我们看看查询的样子:

def subpage = Subpage.findByTitle("Subpage 1")

现在,让我们迭代它的孩子

subpage.subpageChildren.each { child ->

}

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

答案 1 :(得分:1)

你基本上是在创建一个树形结构 - 这里已经有了答案。

Tree structure in GORM (grails)

另外,我只有一个“Page”域类,并使用命名子页面/子页面来引用子节点。