【问题标题】:Grails domain class containing itself包含自身的 Grails 域类
【发布时间】:2014-01-08 00:40:47
【问题描述】:

我正在尝试在 Grails 中实现子页面域类,我希望子页面可以存储另一个子页面。我正在阅读 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 列。使用这样的解决方案,我想我将不得不遍历整个表来获取所有孩子(或者我错过了一些东西......)。

切入正题:我如何实现这一点才能获得一个有可能获得所有孩子的子页面类?

提前致谢。

【问题讨论】:

  • 为什么要迭代整个表?您将在父 ID 上进行选择。孩子们是同一个班级——为什么需要一个单独的表格来保存相同的数据?在那方面,你不必手动执行此操作,这就是 gorm 的用途。
  • 查看这篇关于创建树形结构的文章。 stackoverflow.com/questions/5880672/…

标签: hibernate grails


【解决方案1】:

我已使用您的域并修改了一些内容。为简洁起见,我省略了 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 ->

}

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

【讨论】:

  • 代码的另一个问题。您是否删除了 copareTo 是因为没有必要或只是在注释中缩短块代码?如果你只是为了缩短代码而删除,我什至需要重写这个方法吗?
  • 我刚刚删除了它,以防止它分散我试图提出的观点。如果你需要它,你就需要它。
【解决方案2】:

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

Tree structure in GORM (grails)

顺便说一句,我只需要一个“页面”域类并使用命名子页面/子页面来引用子页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多