用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实体外键关联,导致json解析死循环!

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

jackson java转json hibernate懒加载造成的无限递归问题

@JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties jackson中的@Jso...
  • cym19890801
  • cym19890801
  • 2015年11月05日 11:11
  • 3208

Hibernate 树状映射

目录: 概述环境代码示例测试结果 [一]、概述 在系统中,经常会用到无限级递归的树形结构,比如菜单、组织机构管理、多级分类等等,一般是在同一个表中定义父子关系实现这种树形结构,本文主要讲述如...
  • chilllaxxx
  • chilllaxxx
  • 2016年11月25日 15:13
  • 546

Hibernate基于注解的双向one-to-many映射关系的实现

在项目中用到了一对多的实体类关系映射,之前接触的都是基于配置文件的映射实现,但是公司的大部分都是基于注解的,因此自己参考之前的代码捣鼓了基于注解的一对多的映射关系实现。 背景: 一的一端:Qing...
  • bruce_6
  • bruce_6
  • 2014年07月23日 11:00
  • 2264

springMVC返回hibernate多对多对象的json时 出现无限循环

用ie8时,请求json,eclipse直接死机!!!! 调试时,可以用chrome,看到无限循环的报错。。。类似 {"empty":true,"total":4,"firstResult":0,...
  • baolong47
  • baolong47
  • 2013年09月13日 14:29
  • 8101

目录菜单树的实现及查询

要求: 获取用户能操作的资源集合,这里主要考虑菜单树的获取 框架: springboot + hibernate 菜单树的逻辑是:子菜单存单,父菜单也得存在。 算法逻辑: 传入资源节点Node...
  • m0_37530301
  • m0_37530301
  • 2017年06月20日 20:38
  • 218

树状自关联 hibernate配置,查询

栏目实体 每个栏目有多个子栏目,一个父栏目 一级栏目无父栏目 hibernate配置package com.france.bean;import java.util.HashSet; impor...
  • u011644423
  • u011644423
  • 2015年11月14日 16:55
  • 1933

Hibernate中criteria一对多关联查询时distinct的分页和数量问题

吐个槽: hibernate Criteria 为何不能在结果集返回前就筛出重复,还不能分组,不能 DISTINCT, 否则返回单数据, 希望高手指点。 解决办法:  DetachedC...
  • huaishuming
  • huaishuming
  • 2017年04月28日 01:01
  • 1161

Hibernate旅程(四)Hibernate对数据库删除、查找、更新操作

上篇,我们以向数据库添加操作来演示hibernate持久化对象的三种状态。本节继续hibernate对数据库的其他操作,删除、查询、修改。 Hibernate对数据删除操作 删除User表中个一条数据...
  • lovesummerforever
  • lovesummerforever
  • 2014年02月14日 09:44
  • 59785

Mybatis之高级映射collection (递归查出树形数据之查询部门及部门下所有人员 单节点)

第一步:创建树形数据Beanpublic class DeptTree { private String id; private String name; private Li...
  • FANTASY522272820
  • FANTASY522272820
  • 2017年04月11日 14:57
  • 2442
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用hibernate对递归数据的操作
举报原因:
原因补充:

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