用hibernate对递归数据的操作

原创 2004年08月13日 18:43:00
在工作中,我们常常会碰到具有递归性质记录的数据,最常见的是某个机构部门节点的数据,某个节点一定会有个父节点属性,同时它也许会有若干子节点。所有的节点数据都会存在数据库中一张表中。这种现象在设计模式上叫Composite模式。下面我就给出一个用hibernate操作这种表的例子,关于hibernate配置和建立表结构的部分请参考我的前一篇文章《利用weblogic的数据源作为hibernate的数据源的例子

1.持久化类Node.java
package com.jagie.business.organization;

/**
 * <p>Title: </p>
 * <p>Description: 部门节点</p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: www.jagie.com</p>
 * @author Jagie
 * @version 1.0
 */


public class Node {
  private String ID;//pk

  private String name;//名称
  private String description;//描述

  private Node parent;//上级部门
  private java.util.Set children;//下级部门
  public static void main(String[] args) {
  }
  public String getID() {
    return ID;
  }
  public void setID(String ID) {
    this.ID = ID;
  }
  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;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }
  public String toString(){
    return name;
  }
  public java.util.Set getChildren() {
    return children;
  }
  public void setChildren(java.util.Set children) {
    this.children = children;
  }
}


2.映射文件Node.hbm.xml
[pre]<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
  <class name="com.jagie.business.organization.Node" table="SYS_Node">
    <id name="ID">
      <generator class="uuid.hex" />
    </id>
    <property name="name" />
    <property name="description" />
    <set cascade="save-update" inverse="true" lazy="true" name="children">
      <key column="parent" />
      <one-to-many class="com.jagie.business.organization.Node" />
    </set>
    <many-to-one cascade="none" class="com.jagie.business.organization.Node" 
      column="parent" name="parent" />
  </class>
</hibernate-mapping>[/pre]

3.用SchemaExport创建数据库(略)

4.测试的代码片断

 //获取net.sf.hibernate.Session和net.sf.hibernate.Transaction;

 Session s = JDOUtils.getInstance().getSessionFactory().openSession();
 Transaction t = s.beginTransaction();
 //建立父节点

 Node org = new Node();
 org.setName("北京总公司");
 org.setDescription("这是北京总公司");

 //建立子节点

 Node org2 = new Node();
 org2.setName("海淀分公司");
 org2.setDescription("这是海淀分公司");
 //建立子节点对父节点的引用

 org2.setParent(org);
    
 //持久化

 s.save(org);
 s.save(org2);


 t.commit();
 s.close();


代码运行后,我们观察数据库,发现已经生成表SYS_Node,其结构为
id    varchar2(255)            
name    varchar2(255)    y        
description    varchar2(255)    y        
parent    varchar2(255)    y        

其中y的意思为nullable(可空),同时把我们的节点数据正确的插入了。
你可以自己再用session.find()方法来找出某父节点下面的所有子节点了。
最后,希望这篇短文对你有用。

hibernate实现递归查询

  • 2008年10月13日 16:54
  • 5.43MB
  • 下载

递归算法:解决hibernate实体外键关联,导致json解析死循环!

1:首先谈谈递归       递归算法:递归过程一般通过函数或子过程来实现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。      如何设计递归算法       1.确定递归公式 ...
  • u013628152
  • u013628152
  • 2015-01-09 21:07:51
  • 2280

递归和循环的效率问题

运行下面程序,可以看到递归需要的时间比循环多。#include #includeint main(int argc, char *argv[]) { //循环 PrintN(1000); ...
  • wnl_csdn
  • wnl_csdn
  • 2016-09-13 22:36:31
  • 312

递归删除——项目实战篇

需求分析:Dept是一个自关联表,子部门和父部门是同一张表。删除一个部门的信息时,首先确定它的有没有子部门,如果有子部门就先将其子部门都删除然后再删除父部门。这里就用到了递归删除的方案: j...
  • mrlin6688
  • mrlin6688
  • 2016-12-03 22:07:59
  • 223

让hibernate支持递归、start with connect by prior 查询

由于hibernate的结果对象映射功能很好用,但是有些特殊的sql文hibernate并不支持,比如start with  connect by prior,如何让hibernate支持这种特殊sq...
  • l271640625
  • l271640625
  • 2011-08-01 17:22:57
  • 9195

Hibernate Recursive Query(Hibernate 递归查询) HQL 递归的实现

Hibernate 递归查询通常用于表的自连接/自指向(self association),如下面的表:  id  name  parent_id  1  部门  0 ...
  • l271640625
  • l271640625
  • 2011-08-02 17:31:41
  • 7396

Hibernate使用Oracle的递归查询。

表结构:Create TABLE { ID NUMBER NAME VARCHAR2 PARENT_ID NUMBER }
  • wwcwolf
  • wwcwolf
  • 2014-07-03 11:08:58
  • 546

Hibernate注解实现单表递归树形结构

目录: 概述环境代码示例测试结果 [一]、概述 在系统中,经常会用到无限级递归的树形结构,比如菜单、组织机构管理、多级分类等等,一般是在同一个表中定义父子关系实现这种树形结构,本文主...
  • li758568825
  • li758568825
  • 2017-06-18 11:19:53
  • 668

mySql递归查询函数

CREATE FUNCTION `queryChildLst`(rootId VARCHAR(30)) RETURNS varchar(1000) BEGIN DECLARE s...
  • dly120219891208
  • dly120219891208
  • 2014-12-18 08:52:22
  • 2305

mysql递归查询,mysql中从子类ID查询所有父类(做无限分类经常用到)

mysql递归查询,mysql中从子类ID查询所有父类(做无限分类经常用到) 由于mysql 不支持类似 oracle with ...connect的 递归查询语法 之前一直以为类似的查...
  • qiaqia609
  • qiaqia609
  • 2016-08-04 15:17:29
  • 5813
收藏助手
不良信息举报
您举报文章:用hibernate对递归数据的操作
举报原因:
原因补充:

(最多只允许输入30个字)