用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值