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等远程的异步访问,用到的时候才取出数据。