树经常用来展示目录结构,那么在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. SQL 有父标识的 递归查询

    递归查询,临时表的高级应用 WITH temp AS ( --父项 SELECT * FROM Ar_Area WHERE Ar_Parent = UNION ALL --递归结果集中的下级 SELE ...

  2. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

  3. Java分布式缓存框架

    http://developer.51cto.com/art/201411/457423.htm 在开发中大型Java软件项目时,很多Java架构师都会遇到数据库读写瓶颈,如果你在系统架构时并没有将缓 ...

  4. action方法不返回

    当被请求的action方法中还有资源没有释放时,请求方法是不会返回的,会一直停留在方法中,即使是最后一行,因为请求方法一旦返回,那方法中的资源,引用就没有位置住了,所以所请求的方法会一直不返回,直到方 ...

  5. BigInteger构造函数解析

    1.BigInteger(byte[] val)这个构造函数用于转换一个字节数组包含BigInteger的二进制补码,以二进制表示成一个BigInteger. (用字节数组中值的ASCII码构造Big ...

  6. html_table标签和from表单标签小试手

    Html Body中table(表格)也是一个重要组成部分,下面列举一个简单的实例: ——————————————简单的table—————————————————— <!DOCTYPE HTM ...

  7. javascript dom编程艺术笔记第三章:DOM操作的5个基本方法

    JavaScript的 DOM操作,主要是对DOM这三个字母中D.O.M的操作.D代表的是document(文档),即我们可以使用javascript对文档进行操作,O代表的是object(对象),对 ...

  8. e+开发中的各种问题

    1.数据交换后走的查询公式还是controller所配置的公式

  9. ASP.NET中的验证控件

    ASP.NET提供了如下的控件: RequiredFieldValidator: 字段必填 (ControlTovalidate设定要验证的控件) RangeValidator: 值在给定的最大值,最 ...

  10. 一次ora-1113 记录

    记录博客园的第一天,今天在电脑前发呆,突然感觉自己记忆越来越差,近年来随着工作力度的加强,感觉自己越来越力不从心,问题重复的出现.感觉自己应该去记录点什么了,随选择了用写博客的方式记录一下.第一天先记 ...