`
thingkau
  • 浏览: 72542 次
  • 性别: Icon_minigender_1
  • 来自: 泉州
社区版块
存档分类
最新评论

用Hibernate构造和遍历递归树

阅读更多
1.树由节点Node组成,拥有孩子|父亲|节点深度|是否为叶子节点 等属性。

package com.bjsxt.hibernate;

import java.util.Set;
/**
 * 
 * @hibernate.class table="T_Node"
 */
public class Node {

	/**
	 * 标识符
	 * @hibernate.id generator-class="native"
	 */
	private int id;

	
	/**
	 * 节点名称
	 * @hibernate.property
	 */
	private String name;

	/**
	 * 层次
	 * @hibernate.property
	 */
	private int level;

	/**
	 * 是否叶子节点
	 * @hibernate.property
	 */
	private boolean leaf;

	/**
	 * 父节点 * --- 1
	 * @hibernate.many-to-one
	 * 		column="pid"
	 */
	private Node parent;

	
	/**
	 * 子节点 1 --- *
	 * @hibernate.set
	 * 		inverse="true" lazy="extra"
	 * @hibernate.key
	 * 		column="pid"
	 * @hibernate.one-to-many class="com.bjsxt.hibernate.Node"
	 */
	private Set children;

	public Set getChildren() {
		return children;
	}

	public void setChildren(Set children) {
		this.children = children;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public boolean isLeaf() {
		return leaf;
	}

	public void setLeaf(boolean leaf) {
		this.leaf = leaf;
	}

	public int getLevel() {
		return level;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Node getParent() {
		return parent;
	}

	public void setParent(Node parent) {
		this.parent = parent;
	}
}



配合XDOCLET+ANT生成hibernate的映射文件Node.xml如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.bjsxt.hibernate.Node" table="T_Node">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="level"/>
        <property name="leaf"/>
        <many-to-one name="parent" column="pid"/>
        <set name="children" inverse="true" lazy="extra">
        <key column="pid"/>
        <one-to-many class="com.bjsxt.hibernate.Node"/>
        </set>
    </class>
</hibernate-mapping>

2.构造和遍历递归树保存于数据库中:
NodeManager.java
package com.bjsxt.hibernate;

import java.io.File;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;

public class NodeManager {

	private static NodeManager nodeManager;

	private NodeManager() {
	}
 
	public static synchronized NodeManager getInstance() {
		if (nodeManager == null) {
			nodeManager = new NodeManager();
		}

		return nodeManager;
	}

	// 创建树型结构
	public void createTree(String dir) {
		Session session = HibernateUtils.getSession();

		try {
			session.beginTransaction();

			File root = new File(dir);
			saveTree(root, session, null, 0);

			session.getTransaction().commit();
		} catch (RuntimeException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}
	}

	
	/**
	 * 递归创建一棵树
	 * @param file 		文件实例
	 * @param session 	HiernateSession
	 * @param parent	父节点
	 * @param level		节点深度
	 */
	private void saveTree(File file, Session session, Node parent, int level) {

		if (file == null || !file.exists()) {
			return;
		}

		boolean isLeaf = file.isFile();

		Node node = new Node();
		node.setName(file.getName());
		node.setLevel(level);
		node.setParent(parent);
		node.setLeaf(isLeaf);
		session.save(node);

		File[] subs = file.listFiles();
		if (subs != null && subs.length > 0) {
			for (int i = 0; i < subs.length; i++) {
				saveTree(subs[i], session, node, level + 1);
			}
		}
	}

	public void printTree(int id) {
		Session session = HibernateUtils.getSession();

		try {
			session.beginTransaction();

			Node root = (Node) session.load(Node.class, id);
			printNode(root);

			session.getTransaction().commit();
		} catch (RuntimeException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally {
			HibernateUtils.closeSession(session);
		}
	}

	/**
	 * 打印节点【打印结果是树形结构】
	 * @param node 节点实例
	 */
	private void printNode(Node node) {

		if (node == null) {
			return;
		}
		int level = node.getLevel();
		if (level > 0) {
			for (int i = 0; i < level; i++) {
				System.out.print("  |");
			}
			System.out.print("--");
		}

		System.out.println(node.getName()
				+ (node.isLeaf() ? "" : "[" + node.getChildren().size() + "]"));

		Set children = node.getChildren();
		for (Iterator iter = children.iterator(); iter.hasNext();) {
			Node child = (Node) iter.next();
			printNode(child);
		}
	}
}



3.客户端调用:
新建一测试用例:NodeManagerTest.java:
package com.bjsxt.hibernate;

import junit.framework.TestCase;

public class NodeManagerTest extends TestCase {

	public void testCreateTree() {
		NodeManager.getInstance().createTree("E:\\200809050031\\hibernate\\hibernate_training_tree\\");
	}
   
	public void testPrintTree() {
		NodeManager.getInstance().printTree(1);
	}

}


保证实现已经创建好hibernate配置文件和数据库,打印出来的结果:

hibernate_training_tree[5]
  |--readme.txt
  |--.project
  |--bin[3]
  |  |--log4j.properties
  |  |--com[1]
  |  |  |--bjsxt[1]
  |  |  |  |--hibernate[6]
  |  |  |  |  |--HibernateUtils.class
  |  |  |  |  |--Node.hbm.xml
  |  |  |  |  |--NodeManager.class
  |  |  |  |  |--Node.class
  |  |  |  |  |--NodeManagerTest.class
  |  |  |  |  |--ExportToDB.class
  |  |--hibernate.cfg.xml
  |--.classpath
  |--src[3]
  |  |--hibernate.cfg.xml
  |  |--com[1]
  |  |  |--bjsxt[1]
  |  |  |  |--hibernate[6]
  |  |  |  |  |--Node.java
  |  |  |  |  |--NodeManager.java
  |  |  |  |  |--NodeManagerTest.java
  |  |  |  |  |--HibernateUtils.java
  |  |  |  |  |--Node.hbm.xml
  |  |  |  |  |--ExportToDB.java
  |  |--log4j.properties

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java源码包2

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...

    java源码包---java 源码 大量 实例

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    JAVA上百实例源码以及开源项目源代码

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    JAVA上百实例源码以及开源项目

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    java源码包3

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...

    java源码包4

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    递归遍历矩阵 1个目标文件,简单! 多人聊天室 3个目标文件 第一步:运行ServerData.java 启动服务器,然后服务器处于等待状态 第二步:运行LoginData.java 启动(客户端)登陆界面 输入用户名 ip为本机localhost 第...

    Java学习笔记-个人整理的

    {1.11.3}递归调用}{41}{subsection.1.11.3} {1.12}Java API}{41}{section.1.12} {1.13}Linux命令}{41}{section.1.13} {1.13.1}基本查看、移动}{41}{subsection.1.13.1} {1.13.2}权限}{42}{subsection.1.13.2} ...

Global site tag (gtag.js) - Google Analytics