树经常用来展示目录结构,那么在Hibernate中怎样解决树的映射问题呢?

先来看一个分销商的树形结构的例子


所有分销商

东北区

辽宁省

沈阳医药

吉林省

华北区

北京市

北京医药

河北省

华南区

那么怎样用组合模式抽象这一模型呢?

先看下类图

大家都知道树的存储可以有两种方式

双亲存储

每一个节点都存储它的直接父节点的地址

孩子存储

每个节点都存储它所有直接孩子节点的地址

但是在对象模型中,我们既想知道节点的父亲是谁又想获取它的所有孩子节点

那么类图可以修改如下

上图中,为每个节点都添加了父节点引用,放在Node类中是为了复用

上java代码

抽象Node类

public abstract class Node {

	private String id;

	private String name;
//父节点引用
private Node parent; 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;
} }

Client类

public class Client extends Node {
//分销商级别
private ClientLevel level; public ClientLevel getLevel() {
return level;
} public void setLevel(ClientLevel level) {
this.level = level;
} }

Region类

public class Region extends Node {
//孩子节点集合,只有区域才有可能有孩子节点
private Set children; public Set getChildren() {
return children;
} public void setChildren(Set children) {
this.children = children;
} }

ClientLevel类

public class ClientLevel {

	private String id;

	private String name;

	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;
} }

最关键的是HBM映射文件

HBM--ClientLevel

<hibernate-mapping package="com.tgb.hibernate">
<class name="ClientLevel" table="t_client_level">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
</class> </hibernate-mapping>

HBM--Tree

<hibernate-mapping package="com.tgb.hibernate">
<class name="Node" abstract="true">
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
<many-to-one name="parent" column="pid"/>
<union-subclass name="Region" table="t_region">
<set name="children" inverse="true">
<key column="pid"/>
<one-to-many class="Node"/>
</set>
</union-subclass>
<union-subclass name="Client" table="t_client">
<many-to-one name="level"/>
</union-subclass>
</class>
</hibernate-mapping>

这样就实现了树形结构的映射。

Hibernate:组合模式解决树的映射的更多相关文章

  1. 设计模式16---设计模式之组合模式(Composite)(行为型)

    1.场景模拟 使用软件模拟大树的根节点和树枝节点和叶子节点 抽象为两类,容器节点和叶子节点 2.不用模式的解决方案 package demo14.composite.example1; import ...

  2. javascript设计模式——组合模式

    前面的话 在程序设计中,有一些和“事物是由相似的子事物构成”类似的思想.组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的.本文将详细介绍组合模式 宏命令 宏 ...

  3. 设计模式(9)--Composite(组合模式)--结构型

    1.模式定义: 组合模式属于对象的结构模式,有时又叫做“部分——整体”模式.组合模式将对象组织到树结构中,可以用来描述整体与部分的关系.组合模式可以使客户端将单纯元素与复合元素同等看待. 2.模式特点 ...

  4. 【GOF23设计模式】组合模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_组合模式.树状结构.杀毒软件架构.JUnite底层架构.常见开发场景 package com.test.composite ...

  5. 设计模式-组合模式(Composite Pattern)

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 前置技能:认识数据结构中的树形结构. 组合模式简介 组合模式是将对象组合成树形结构以表示“部分- ...

  6. JAVA设计模式之组合模式(composite)

    组合模式:树状结构专用模式 代码如下: package com.srr.dp.composite; import java.util.ArrayList; import java.util.List; ...

  7. 设计模式(十)——组合模式(HashMap源码解析)

    1 看一个学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: 2 传统方案解决学校院系展示 3 传统方案解决 ...

  8. 【转】HeadFirst 组合模式+迭代器错误原因以及解决代码

    http://blog.csdn.net/sugar_girl/article/details/53400267     <HeadFirst JAVA设计模式>中用迭代器迭代组合模式是存 ...

  9. Composite 组合模式 树 递归 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. MVC中HtmlHelper用法大全参考

    MVC中HtmlHelper用法大全参考 解析MVC中HtmlHelper控件7个大类中各个控件的主要使用方法(1) 2012-02-27 16:25 HtmlHelper类在命令System.Web ...

  2. python中关于正则表达式二

    2.2 反向引用 \1, \2... 表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来.在获取匹配结果的时候,小括号包含的表达式所匹配到的字符 ...

  3. WPF:保存窗口当前状态截图方法

    在制作软件使用手册或者操作示范市,比较常用方式有截图和视频制作.如果软件内置当前状态的截图和操作视频的导出功能,则将极大简化这方面的工作.使用wpf编写的UI界面,截图的导出功能逻辑相对简单,通用的实 ...

  4. jdbc-connect-oracle12c-pdb/cdb(jdbc连接oracle12c的pdb和cdb)

      1       本文简介: 通过特意引发问题,聚焦问题,解决问题,并循序渐进 最后总结jdbc连接oracle12c中cdb和pdb的条件. 软件环境:Redhat7.1+orcacle12c 2 ...

  5. oracle级联删除 触发器

    CREATE TABLE STUDENT( --创建学生表  ID NUMBER(10) PRIMARY KEY,   --主键ID  SNAME VARCHAR2(20),  CLASSNAME V ...

  6. Xcode7 Xcode6 中添加pch文件

    在Xcode7 和 Xcode6 中添加.pch文件是一样的,具体操作图文如下: 第一步:在Xcode的项目里,一般在Supporting Files 文件夹下创建,选中Supporting File ...

  7. C#操作redis代码汇总

    马上要用redis来改造现有的o2o项目了,在linux下部署了个redis,顺便研究了下代码操作,分享下代码 using System; using System.Collections.Gener ...

  8. javascript——四种函数调用形式

    此文的目的是分析函数的四种调用形式,弄清楚函数中this的意义,明确构造函对象的过程,学会使用上下文调用函数. 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而 ...

  9. java_UML:继承/泛化、实现、依赖、关联、聚合、组合的联系与区别 (2016-07-12)

    分别介绍这几种关系: UML关系:继承(泛化).实现.依赖.关联.聚合.组合的联系与区别 一.表示符号上的区别 二.具体区别与联系 1. 继承/泛化(Generalization) [泛化关系]:是一 ...

  10. 《C语言学习笔记》指针数组及其应用

    C语言中,最灵活但又容易出错的莫过于指针了.而指针数组,是在C中很常见的一个应用.指针数组的意思是说,这个数组存储的所有对象都为指针.除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样. # ...