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>

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


猜你喜欢

转载自blog.csdn.net/wwwwenhuan/article/details/12201847
今日推荐