hibernate生成树

来源:互联网 发布:淘宝比基尼买家秀 编辑:程序博客网 时间:2024/06/06 20:36
  1. package com.bjsxt.hibernate;
  2. import java.util.Set;
  3. public class Node {
  4.     // 标识符
  5.     private int id;
  6.     // 节点名称
  7.     private String name;
  8.     // 层次
  9.     private int level;
  10.     // 是否叶子节点
  11.     private boolean leaf;
  12.     // 父节点 * --- 1
  13.     private Node parent;
  14.     // 子节点 1 --- *
  15.     private Set children;
  16.     public Set getChildren() {
  17.         return children;
  18.     }
  19.     public void setChildren(Set children) {
  20.         this.children = children;
  21.     }
  22.     public int getId() {
  23.         return id;
  24.     }
  25.     public void setId(int id) {
  26.         this.id = id;
  27.     }
  28.     public boolean isLeaf() {
  29.         return leaf;
  30.     }
  31.     public void setLeaf(boolean leaf) {
  32.         this.leaf = leaf;
  33.     }
  34.     public int getLevel() {
  35.         return level;
  36.     }
  37.     public void setLevel(int level) {
  38.         this.level = level;
  39.     }
  40.     public String getName() {
  41.         return name;
  42.     }
  43.     public void setName(String name) {
  44.         this.name = name;
  45.     }
  46.     public Node getParent() {
  47.         return parent;
  48.     }
  49.     public void setParent(Node parent) {
  50.         this.parent = parent;
  51.     }
  52. }

 

  1.   <?xml version="1.0" ?> 
  2.   <!DOCTYPE hibernate-mapping (View Source for full doctype...)> 
  3. - <hibernate-mapping default-cascade="none" default-access="property" default-lazy="true" auto-import="true">
  4. - <class name="com.bjsxt.hibernate.Node" table="t_node" mutable="true" polymorphism="implicit" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version">
  5. - <id name="id">
  6.   <generator class="native" /> 
  7.   </id>
  8.   <property name="name" unique="false" optimistic-lock="true" lazy="false" generated="never" /> 
  9.   <property name="level" unique="false" optimistic-lock="true" lazy="false" generated="never" /> 
  10.   <property name="leaf" unique="false" optimistic-lock="true" lazy="false" generated="never" /> 
  11.   <many-to-one name="parent" column="pid" unique="false" update="true" insert="true" optimistic-lock="true" not-found="exception" embed-xml="true" /> 
  12. - <set name="children" lazy="extra" inverse="true" sort="unsorted" mutable="true" optimistic-lock="true" embed-xml="true">
  13.   <key column="pid" on-delete="noaction" /> 
  14.   <one-to-many class="com.bjsxt.hibernate.Node" not-found="exception" embed-xml="true" /> 
  15.   </set>
  16.   </class>
  17.   </hibernate-mapping>
 
  1. package com.bjsxt.hibernate;
  2. import java.io.File;
  3. import java.util.Iterator;
  4. import java.util.Set;
  5. import org.hibernate.Session;
  6. public class NodeManager {
  7.     private static NodeManager nodeManager;
  8.     private NodeManager() {
  9.     }
  10.     public static synchronized NodeManager getInstance() {
  11.         if (nodeManager == null) {
  12.             nodeManager = new NodeManager();
  13.         }
  14.         return nodeManager;
  15.     }
  16.     // 创建树型结构
  17.     public void createTree(String dir) {
  18.         Session session = HibernateUtils.getSession();
  19.         try {
  20.             session.beginTransaction();
  21.             File root = new File(dir);
  22.             saveTree(root, session, null, 0);
  23.             session.getTransaction().commit();
  24.         } catch (RuntimeException e) {
  25.             e.printStackTrace();
  26.             session.getTransaction().rollback();
  27.         } finally {
  28.             HibernateUtils.closeSession(session);
  29.         }
  30.     }
  31.     // 递归创建一棵树
  32.     private void saveTree(File file, Session session, Node parent, int level) {
  33.         if (file == null || !file.exists()) {
  34.             return;
  35.         }
  36.         boolean isLeaf = file.isFile();
  37.         Node node = new Node();
  38.         node.setName(file.getName());
  39.         node.setLevel(level);
  40.         node.setParent(parent);
  41.         node.setLeaf(isLeaf);
  42.         session.save(node);
  43.         File[] subs = file.listFiles();
  44.         if (subs != null && subs.length > 0) {
  45.             for (int i = 0; i < subs.length; i++) {
  46.                 saveTree(subs[i], session, node, level + 1);
  47.             }
  48.         }
  49.     }
  50.     public void printTree(int id) {
  51.         Session session = HibernateUtils.getSession();
  52.         try {
  53.             session.beginTransaction();
  54.             Node root = (Node) session.load(Node.class, id);
  55.             printNode(root);
  56.             session.getTransaction().commit();
  57.         } catch (RuntimeException e) {
  58.             e.printStackTrace();
  59.             session.getTransaction().rollback();
  60.         } finally {
  61.             HibernateUtils.closeSession(session);
  62.         }
  63.     }
  64.     private void printNode(Node node) {
  65.         if (node == null) {
  66.             return;
  67.         }
  68.         int level = node.getLevel();
  69.         if (level > 0) {
  70.             for (int i = 0; i < level; i++) {
  71.                 System.out.print("  |");
  72.             }
  73.             System.out.print("--");
  74.         }
  75.         System.out.println(node.getName()
  76.                 + (node.isLeaf() ? "" : "[" + node.getChildren().size() + "]"));
  77.         Set children = node.getChildren();
  78.         for (Iterator iter = children.iterator(); iter.hasNext();) {
  79.             Node child = (Node) iter.next();
  80.             printNode(child);
  81.         }
  82.     }
  83. }