zoukankan      html  css  js  c++  java
  • 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>
    

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


  • 相关阅读:
    【.NET】VS2013创建Windows服务与调试服务
    【JS】处理数据四舍五入(tofixed与round的区别详解)
    【微信小程序】 基础语义笔记2:基本组件、获取节点信息
    面向对象和面向过程的优点和缺点
    【微信小程序】 基础语义笔记1:配置、页面文件、组件。
    【微信小程序】 wxParse组件
    zookeeper 碎片知识点
    zookeeper 基本概念
    RocketMQ 知识点
    单例模式---双层检验锁+volatile
  • 原文地址:https://www.cnblogs.com/james1207/p/3347797.html
Copyright © 2011-2022 走看看