Hibernate:组合模式解决树的映射
树经常用来展示目录结构,那么在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:组合模式解决树的映射的更多相关文章
- 设计模式16---设计模式之组合模式(Composite)(行为型)
1.场景模拟 使用软件模拟大树的根节点和树枝节点和叶子节点 抽象为两类,容器节点和叶子节点 2.不用模式的解决方案 package demo14.composite.example1; import ...
- javascript设计模式——组合模式
前面的话 在程序设计中,有一些和“事物是由相似的子事物构成”类似的思想.组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的.本文将详细介绍组合模式 宏命令 宏 ...
- 设计模式(9)--Composite(组合模式)--结构型
1.模式定义: 组合模式属于对象的结构模式,有时又叫做“部分——整体”模式.组合模式将对象组织到树结构中,可以用来描述整体与部分的关系.组合模式可以使客户端将单纯元素与复合元素同等看待. 2.模式特点 ...
- 【GOF23设计模式】组合模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_组合模式.树状结构.杀毒软件架构.JUnite底层架构.常见开发场景 package com.test.composite ...
- 设计模式-组合模式(Composite Pattern)
本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 前置技能:认识数据结构中的树形结构. 组合模式简介 组合模式是将对象组合成树形结构以表示“部分- ...
- JAVA设计模式之组合模式(composite)
组合模式:树状结构专用模式 代码如下: package com.srr.dp.composite; import java.util.ArrayList; import java.util.List; ...
- 设计模式(十)——组合模式(HashMap源码解析)
1 看一个学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: 2 传统方案解决学校院系展示 3 传统方案解决 ...
- 【转】HeadFirst 组合模式+迭代器错误原因以及解决代码
http://blog.csdn.net/sugar_girl/article/details/53400267 <HeadFirst JAVA设计模式>中用迭代器迭代组合模式是存 ...
- Composite 组合模式 树 递归 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- jQuery Validate验证框架使用
jQuery Validate使用前的准备,需要下载相应js包括:1.jquery.validate.min.js.2.additional-methods.min.js. 当然必不可少的js jQu ...
- C#里面比较时间大小三种方法
1.比较时间大小的实验 string st1="12:13";string st2="14:14";DateTime dt1=Convert.ToDateTim ...
- 使用T4模板为EF框架添加实体根据数据库自动生成字段注释的功能
转自http://jeffblog.sinaapp.com/archives/501 首先我们先下载一个文件GetSummery,这里我提供了,大家可以直接下载:下载 我们在数据库建立一个表,并给表中 ...
- bootstrap 正则表达式
<asp:TextBox runat="server" title="邮箱正确格式:xxx@xxx.xxx" class="form-cont ...
- ios fixed属性bug解决方法
在内容层外面包一个div 加上样式:position:fixed;top:0px; bottom:50px;overflow:scroll; 就可以完美解决
- iOS开发-自动布局篇:史上最牛的自动布局教学!
转载自:http://www.jianshu.com/p/f6cf9ef451d9 本文我们将提到: aotulayout(手码) VFL aotulayout(Xib) Masonry(第三方框架) ...
- 【笔记】mongodb启动不了:child process failed, exited with error number 100
今天在启动mongodb的时候,发现起不来,报错:child process failed, exited with error number 100然后先去/var/log/mongo/mongod ...
- Essential C++ 学习笔记01--基本语法
<Essential C++>1.1-1.4节笔记 1. main 函数 main 函数是代码的入口,若无 main 函数,编译不通过. main 函数通常声明为 int, return ...
- JPA的泛型DAO设计及使用
使用如Hibernate或者JPA作为持久化的解决方案时,设计一个泛型的DAO抽象父类可以方便各个实体的通用CRUD操作.由于此时大部分实体DAO的CRUD操作基本一样,采用泛型设计解决这个问题,带来 ...
- python 自动化之路 day 08 面向对象进阶
面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 2 ...