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>
    

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


  • 相关阅读:
    Spring-security+Oauth2.0 零散知识汇总(备忘)
    Java Mail 发送邮件 JMail 多人 解决乱码 带附件
    AngularJs 性能优化英文原版(个人备份使用)
    Java基础练习- Java-Swing 拼图游戏 第一部分:创建java窗口添加窗口元素
    Json格式页面解析不出来
    spring-security 异常处理求助
    MySQL-存储过程
    吸血鬼数字
    浏览器的兼容性
    es6-----promise
  • 原文地址:https://www.cnblogs.com/james1207/p/3347797.html
Copyright © 2011-2022 走看看