我正在尝试在Grails中实现Subpage域类,我希望Subpage可以存储另一个Subpage。我正在阅读this和this帖子,但是这些解决方案似乎都不适合我。
我的课看起来像这样:
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 ->
}
基本上就是这样。只需要一张桌子。