使用Hibernate建立树形结构
递归查询子节点,会发出N多次select查询
可以在Node中定义一个字段,额外记录其与parent的id间的关系,如1|3|6|12
然后使用like进行模糊查询,只需要查询1次即可找出所有的child。
虽然模糊查询慢,但只发出1条语句,所以效率可能比发出N多次递归查询快!
实体类
package org.leadfar.hibernate.model; import java.util.Set; public class Node { private int id; private String name; private Node parent; private Set<Node> children;//一的一端使用集合存储对方引用 public int getId() { return id; } public void setId(int 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 Set<Node> getChildren() { return children; } public void setChildren(Set<Node> children) { this.children = children; } }
映射文件
<?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 package="org.hibernate.auction"> <class name="org.leadfar.hibernate.model.Node" table="t_node" > <!-- id为数据库标识,作为主键 --> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="parent" column="pid"> </many-to-one> <set name="children" lazy="extra" inverse="true"> <key column="pid"></key> <one-to-many class="org.leadfar.hibernate.model.Node"></one-to-many> </set> </class> </hibernate-mapping>
测试
package org.leadfar.hibernate.model; import java.io.File; import java.util.Iterator; import java.util.Set; import junit.framework.TestCase; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class Test_tree extends TestCase { /** * 建立一个文件目录树。可以根据某个节点查找其父节点,也可以查找其子节点 * 查找父节点--many-to-one * 查找子节点--one-to-many * * 关联关系---parent字段,可以看做是外键 * 从多的一端即孩子端建立关联关系 */ public void tree_save() { Configuration cfg = new Configuration().configure(); SessionFactory sfactory = cfg.buildSessionFactory(); Session session = sfactory.openSession(); try { session.beginTransaction(); save(session,new File("F:\\oracle"),null); session.getTransaction().commit(); } catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { session.close(); } } public void tree_findParent() { Configuration cfg = new Configuration().configure(); SessionFactory sfactory = cfg.buildSessionFactory(); Session session = sfactory.openSession(); try { session.beginTransaction(); Node node = (Node)session.load(Node.class, 2034); find_parent(node); session.getTransaction().commit(); } catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { session.close(); } } public void tree_findChild() { Configuration cfg = new Configuration().configure(); SessionFactory sfactory = cfg.buildSessionFactory(); Session session = sfactory.openSession(); try { session.beginTransaction(); Node node = (Node)session.load(Node.class, 22); find_child(node,0); session.getTransaction().commit(); } catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { session.close(); } } //保存一个文件目录树到数据库---parent记录父子关系 private void save(Session session,File file,Node parent) { Node node = new Node(); node.setName(file.getName()); node.setParent(parent); session.save(node); if(file.exists()) { File[] f = file.listFiles(); if(f!=null && f.length>0) { for(File sub : f) { if(sub.isDirectory()) save(session,sub,node); } } } } //查找给定节点的父节点 private void find_parent(Node node) { System.out.print(node.getName()); Node parent = node.getParent(); if(parent!=null) { System.out.print("-->"); find_parent(parent); } } //给定节点查找其子节点 private void find_child(Node node,int level) { for(int i=0;i<level;i++) { System.out.print("\t"); } System.out.println(node.getName()); Set<Node> childs = node.getChildren(); if(childs.size()!=0) { for(Node n : childs){ find_child(n,level+1); } } } }
相关推荐
标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...
本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...
本文将深入探讨“Hibernate自身关联一对多实例(树形结构)”这一主题,这在构建具有层次结构的数据模型时尤其常见,例如组织结构、地区树或者商品分类等。 首先,我们需要理解Hibernate的核心概念。Hibernate允许...
这个压缩包文件“HibernateORM”很可能包含了关于如何在实际项目中设置和使用Hibernate一对多双向关联的示例代码、配置文件或者详细教程。通过学习这些材料,开发者能够深入理解如何在Java应用中利用Hibernate来处理...
在提供的压缩包文件`bionetoonetable`中,可能包含了示例代码或者相关的配置文件,用于演示双向一对一基于主键的关联映射的实现。具体的内容需要查看文件才能了解详情。 总结,双向一对一基于主键的关联映射是...
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
在Hibernate中,一对一关联可以通过配置XML映射文件或使用注解来实现。这里我们将使用注解方式进行说明。首先,我们需要在两个实体类中分别定义对应的属性,并使用`@OneToOne`注解来指定关联关系。 1. 实体类A: ``...
在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...
“Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...
"hibernate_many2many_2"这个文件名可能是指一个关于Hibernate多对多关联的示例或教程的第二部分,可能包含配置文件、Java实体类、映射文件以及相关的测试代码。 **详细知识点:** 1. **实体类定义**:在Hibernate...
总结来说,映射树形结构在Hibernate中是一项重要技能,它涉及到对数据库设计的理解和ORM框架的熟练运用。掌握不同的映射策略以及如何在代码中实现它们,将有助于提升开发效率并优化应用程序性能。通过研究提供的...
在Java的持久化框架Hibernate中,一对多关联映射是一种常见的关系映射方式,它用于表示一个实体(如用户)可以拥有多个子实体(如订单)的情况。在本篇文章中,我们将深入探讨如何实现双向关联的一对多映射,以及在...
在Java的持久化框架Hibernate中,双向多对多关联映射是一种常见的数据关系模型,它允许两个实体类之间存在多个实例互相引用的情况。本练习旨在帮助开发者深入理解并熟练运用这种映射方式。通过以下详细讲解,我们将...
在Java持久化框架Hibernate中,一对一双向关联映射是一种重要的数据对象关系映射策略,它允许我们在数据库中的两个实体之间建立一对一的关系,并且在Java对象模型中可以从任一侧访问另一侧的对象。这种映射方式增加...
在Hibernate中,一对一关联的配置主要通过注解或XML配置文件完成。对于双向关联,我们需要在两个实体类中分别设置相应的属性和关联注解。 在实体类A中,我们将添加一个类型为B的属性,并使用`@OneToOne`注解来指定...
在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系数据库模型与对象模型之间的映射方式。这种映射允许在一个实体类中存在多个另一个实体类的实例,而在另一个实体类中也可能存在对第一个实体类的...