GORM树形结构(grails)

时间:2011-05-04 08:32:19

标签: java hibernate grails groovy gorm

我正在尝试在GORM中定义树结构。这是我的模特:

class Tree {
    String name
    Level rootLevel

    static hasOne = [rootLevel: Level]
    static hasMany = [levels: Level]
    static mappedBy = [levels:"parentTree"]
}

class Level {
    String name
    Tree parentTree
    Level parentLevel
    Set<Level> subLevels

    static belongsTo = [parentTree: Tree]
    static hasMany = [subLevels: Level]
}

插入似乎工作正常,但是当我无法加载具有多个级别和子级别的树时。 我想我错过了关系中的一些东西: - 树应该引用rootLevel(以及可选的所有子级别) - 一个Level应该引用它的父级别,它的子级别和全局父树

你能指出正确的方向来获得这样的树状结构吗? 感谢

3 个答案:

答案 0 :(得分:11)

我不喜欢你的树形结构,所以我创建了自己的结构:)

Class TreeNode {
    String name
    TreeNode parent

    static hasMany = [children: TreeNode]

    //returns the root node, and by extension, the entire tree!
    TreeNode getRootNode(){
       if(parent){
          //if parent is not null then by definition this node is a child node of the tree.
          return parent.getRootNode()
       }else{
          //if parent is null then by definition it is the root node.
          return this
       }
    }

    //you might not need this function, but ill add it as it is common in tree structures
    boolean isLeaf(){
       //determines if this node is a leaf node. a leaf is a node with zero childrens
       return children.isEmpty()
    }
}

至于确保加载所有treenode,您始终可以为父节点和子节点的每个treeNode使用eager / non-lazy抓取。但是,如果你的树结构非常大,可能会有性能损失......

至于渴望/懒惰的提取。看看这里:Using lazy property fetching in Grails / Gorm

答案 1 :(得分:0)

  

问题是级别是使用父树ID填充的,但是当您加载树时,您会在Level类中遇到以下错误“找到具有给定标识符的多行”。

您的问题似乎是每棵树都有多个根节点。这是一种不寻常的方法。要使其有效,您必须使用Level rootLevel替换实体Tree中的Set<Level> roots

答案 2 :(得分:-1)

我最终得到了这个解决方案(感谢朋友):

class Tree {
   String name
   Level rootLevel

   static hasMany = [levels: Level]
   static mappedBy = [rootLevel: "parentTree", levels: "owningTree"]

   static constraints = {rootLevel(nullable: true)}
}

class Level {
   String name
   Tree parentTree
   Tree owningTree
   Level parentLevel
   Set<Level> subLevels

   static belongsTo = [owningTree: Tree, parentLevel: Level]
   static hasMany = [subLevels: Level]
   static mappedBy = [parentTree: "rootLevel", owningTree: "levels", subLevels: "parentLevel"]

   static constraints = {
       parentTree(nullable: true)
       parentLevel(nullable: true)
   }
}

我错过了Tree和Level(owningTree和parentTree)之间的两个关系以及一些来帮助休眠的mappedBy配置。