该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-04-23
一张表里有两个字段,一个是当前这个结点编号(自增量就行),一个是他的父结点编号(“关联”那个自增量)。
然后一条SQL语句都读到一个Hashtable里,key就是这个结点的编号,value是自己定义的一个树结点的数据结构对象(要有他父结点的引用,和孩子结点的引用集合),把Hashtable遍历一边,就可以把这两个引用对象的值赋上。这就是个树了。 具体怎么显示出来,可以写个标签,可以参照tomcat自带的那个管理工具中的那棵树 |
|
返回顶楼 | |
发表时间:2004-05-11
我倒觉得实际用到的tree的节点都不多,更新频率非常低(像部门,栏目总不能天天改吧),完全可以一次性读到内存缓存起来,不需要特别考虑数据库读写的性能。
除非真的有成千上万的数据保存在树形结构的表中 |
|
返回顶楼 | |
发表时间:2004-05-11
我现在就正在尝试实现tree
不过好象只能形成单向关系。一用双向关联就出错 |
|
返回顶楼 | |
发表时间:2004-05-18
beforeeight 写道 一张表里有两个字段,一个是当前这个结点编号(自增量就行),一个是他的父结点编号(“关联”那个自增量)。
然后一条SQL语句都读到一个Hashtable里,key就是这个结点的编号,value是自己定义的一个树结点的数据结构对象(要有他父结点的引用,和孩子结点的引用集合),把Hashtable遍历一边,就可以把这两个引用对象的值赋上。这就是个树了。 具体怎么显示出来,可以写个标签,可以参照tomcat自带的那个管理工具中的那棵树 请教一下你是如何用一个sql将一个指定节点的所有子节点读出来的呢 在这种情况下如果我想得到某个节点的所有上级节点(包括父节点,父节点的父节点……) 请问sql应该怎么写呢 谢谢 |
|
返回顶楼 | |
发表时间: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()来实现这样的查询。 |
|
返回顶楼 | |
发表时间: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);; } } |
|
返回顶楼 | |
发表时间: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; } } |
|
返回顶楼 | |
发表时间:2004-09-15
我是直接改了hibernate让他支持connect by prior
因为我只用oracle. |
|
返回顶楼 | |
发表时间:2004-12-15
不用改hibernate,你看看我做的,多自然的实现,好酷^_^
|
|
返回顶楼 | |
发表时间:2004-12-15
为什么不考虑用XML来存储树型结构?像部门信息这种变动已应该不是很大吧?——乱说的,嘿嘿,不要扔臭鸡蛋
|
|
返回顶楼 | |