首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hiberante_Annotation<Tree>

2013-02-24 
Hiberante_AnnotationTreeHibernateTree映射 提取树,都很熟悉了,数据结构中的经典的二叉树,学过数据结构

Hiberante_Annotation<Tree>

Hibernate  Tree映射

 

提取树,都很熟悉了,数据结构中的经典的二叉树,学过数据结构的人都知道那四种遍历的方法,在Hibernate中所谓的树状映射,其实就是在一张表中保存的数据中,数据之间都有关系,好比一所大学,就说我的学校长安大学了,长安大学下面有公路学院汽车学院材料学院软件工程学院等等,那么每一个学院下面又有N多个系,依次类推,那么要是设计一张表,保存id和名字,将长安大学和她所有的学院和学院下所有的系保存起来,那么需要多添加一个字段,就是父Id比如说长安大学的id是1,材料学院id是2,那么材料学院的父id是1,如此等等,每一项数据都有一个父id,这样就类似一棵树了,但不一定是二叉树,那么树的根节点是长安大学,其父id为null.

 

在Hibernate中就可以用一个树状的ORM来编写实体了:

 

就拿上面的例子来说,有一个Node实体:

 

来一个取出数据的测试,这里只用取出一个长安大学的根节点(树中的术语)

 

@Test    publicvoid testLoad(){       Session session = sf.openSession();       Node root = (Node)session.load(Node.class, 1);       diGuiPrint(root,0);       session.close();    }    /**     * 递归打印树状结构     * @param root     * @param level     */    privatevoid diGuiPrint(Node root,int level) {       StringBuilder preStr = new StringBuilder("");       for (int i = 0; i < level; i++) {           preStr.append("---");       }       System.out.println(preStr+root.getName());       for (Node child : root.getChildren()) {           //如果是子节点,就在加三个"---"           diGuiPrint(child,level+1);       }    }


 

打印的效果:

 

长安大学

---材料学院

------金属材料

------材料成型机控制工程

---软件工程学院

------软件设计

------软件分析

 

 

总结:上面加fetch的类型设置为EAGER了,如果表中的数据很大的时候,这种效率是很低的,如果数据不大,就可以用,然而不设置这个却得不到想要的效果,控制台输出时是一条sql一个结果,当然在hibernate.cfg.xml中去掉show_sql的属性,就可以了,这样就看不到sql了,当然这不是一个着眼于问题的方法,如果实在需要,我们可以用Ajax等远程的异步访问,用到的时候才取出数据。

热点排行