论坛首页 Java企业应用论坛

关于在Hibernate中高效的处理Tree结构?

浏览 46843 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-04-23  
一张表里有两个字段,一个是当前这个结点编号(自增量就行),一个是他的父结点编号(“关联”那个自增量)。
然后一条SQL语句都读到一个Hashtable里,key就是这个结点的编号,value是自己定义的一个树结点的数据结构对象(要有他父结点的引用,和孩子结点的引用集合),把Hashtable遍历一边,就可以把这两个引用对象的值赋上。这就是个树了。
具体怎么显示出来,可以写个标签,可以参照tomcat自带的那个管理工具中的那棵树
0 请登录后投票
   发表时间:2004-05-11  
我倒觉得实际用到的tree的节点都不多,更新频率非常低(像部门,栏目总不能天天改吧),完全可以一次性读到内存缓存起来,不需要特别考虑数据库读写的性能。
除非真的有成千上万的数据保存在树形结构的表中
0 请登录后投票
   发表时间:2004-05-11  
我现在就正在尝试实现tree
不过好象只能形成单向关系。一用双向关联就出错
0 请登录后投票
   发表时间:2004-05-18  
beforeeight 写道
一张表里有两个字段,一个是当前这个结点编号(自增量就行),一个是他的父结点编号(“关联”那个自增量)。
然后一条SQL语句都读到一个Hashtable里,key就是这个结点的编号,value是自己定义的一个树结点的数据结构对象(要有他父结点的引用,和孩子结点的引用集合),把Hashtable遍历一边,就可以把这两个引用对象的值赋上。这就是个树了。
具体怎么显示出来,可以写个标签,可以参照tomcat自带的那个管理工具中的那棵树


请教一下你是如何用一个sql将一个指定节点的所有子节点读出来的呢
在这种情况下如果我想得到某个节点的所有上级节点(包括父节点,父节点的父节点……)
请问sql应该怎么写呢
谢谢
0 请登录后投票
   发表时间:2004-05-31  
例如有一张表,记录树型结构,有sub_id,parent_id字段
oracle中我可以这样
select * from table_XXX start with sub_id=XXX connect by prior parent_id=sub_id;从子节点上溯
select * from table_XXX start with sub_id=XXX connect by prior sub_id=parent_id;从根节点遍历
hibernate中如果是针对oracle可以使用createSQLQuery()来实现这样的查询。
0 请登录后投票
   发表时间:2004-07-05  
我做的時候只是先查出第一層,然後對這個根做一個遞歸就可以呀
	private void buildChild(FolderListForm folderListForm, DocPO docPO);
		throws Exception {
		Collection children = docPO.getChildren();;
		int order = 1;
		for (java.util.Iterator it = children.iterator();; it.hasNext();;); {
			DocPO child = (DocPO); it.next();;
			DocTreeNodeForm docTreeNodeForm = new DocTreeNodeForm();;
			BeanUtils.copyProperties(docTreeNodeForm, child);;
			folderListForm.getDocTreeNodeFormList();.add(docTreeNodeForm);;
			buildChild(folderListForm, child);;
		}
	}
0 请登录后投票
   发表时间:2004-08-30  
请注意parent和children都映射到同一个字段fk_parend_id,对树各种操作居然能成功,不得不佩服Hibernate的强悍!
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.Stack;
/**
 * @hibernate.class table="CATS"
 *  dynamic-update="true"
 * dynamic-insert="true"
 *
 */
public class Cat {
	private Long id; // identifier
	private List children = new ArrayList();;
	private Cat parent;
              	/**
	 * @hibernate.id 
	 * generator-class="native" 
	 * column="cat_id"
	 */
	public Long getId(); {
		return id;
	}
	private void setId(Long id); {
		this.id = id;
	}
	public Cat addChildren(Cat child); {
		children.add(child);;
		return this;
	}
	/**
	 * @hibernate.list 
	 * cascade="all"
	 * lazy="true"
	 * @hibernate.collection-key 
	 * column="fk_parent_id"
	 * @hibernate.collection-one-to-many 
	 * class="com.nosqldb.bo.Cat"
	 
	 * @hibernate.collection-index 
	 * column="index_parent_id"
	 */
	public List getChildren(); {
		return children;
	}
	/**
	 * @param children The children to set.
	 */
	public void setChildren(List children); {
		this.children = children;
	}
	/**
	 * @return
	 * @hibernate.many-to-one
	 * column="fk_parent_id"
	 * class="com.nosqldb.bo.Cat"
	 * cascade="all"
	 */
	public Cat getParent(); {
		return parent;
	}
	/**
	 * @param parent The parent to set.
	 */
	public void setParent(Cat parent); {
		this.parent = parent;
	}
	/**
	 * 树形遍历
	 * 不用递归,用堆栈.
	 * 这里只是做为例子,本人不建议把业务逻辑封装在Entity层.
                */
	public List getVisitResults(); {
		List l = new ArrayList();;
		Stack s = new Stack();;
		s.push(this);;
		while (s.empty(); == false); {
		   Cat c = (Cat); s.pop();;
		   l.add(c);;
		   List children = c.getChildren();;
		      if (children != null); {
		         for (int i = 0; i <  hildren.size();; i++);   {
			Cat cat = (Cat); children.get(i);;
			s.push(cat);;
		         }//end for
		     }//end if
		}//end while
		return l;
	}
}
0 请登录后投票
   发表时间:2004-09-15  
我是直接改了hibernate让他支持connect by prior
因为我只用oracle.
0 请登录后投票
   发表时间:2004-12-15  
不用改hibernate,你看看我做的,多自然的实现,好酷^_^
0 请登录后投票
   发表时间:2004-12-15  
为什么不考虑用XML来存储树型结构?像部门信息这种变动已应该不是很大吧?——乱说的,嘿嘿,不要扔臭鸡蛋
1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics