本文向大家介绍Hibernate树形结构,可能好多人还不了解Hibernate树形结构,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。
在系统中,经常会用到无限级的Hibernate树形结构分类,如组织机构管理、商品/地区分类等等。一般无外采用两种方式:
◆一是类似struts-menu的XML文件管理方式,配置起来比较方便,但很难与系统中其它应用数据集成;
◆二是使用数据库存储,定义父子关系。
在我们现在开发的一个产品中,实现了一套Hibernate树形结构的处理方法,简介如下:
一.Hibernate树形结构显示
使用的是xtree。为便于编辑维护,自己写了一个左键弹出菜单(xtree的右键事件无法更改),进行节点的添加、修改、删除、转移操作。(PS:这套维护界面是完全跨浏览器的,有兴趣的不妨一试)
二.关联关系:
可以使用objects对象来配置关联关系,实现多对多/一对多等关系。在BaseTree中,getObjects()方法是abstract的,可以根据需要自己定义。如论坛分类与每个分类所对应的贴子相关联,商品分类与商品编码相关联等,可以根据需要来处理hbm文件。若需要多项关联,亦可扩展。如菜单与用户、部门、岗位分别进行关联
三.主要代码:
- package test.testtree.base;
- import java.util.*;
- public abstract class BaseTree extends BasePojo implements Tree{
- protected String code;
- protected String name;
- protected String description;
- protected BaseTree parent;
- protected Set children = new HashSet();
- protected Set objects = new HashSet();
- public void setCode(String code) {
- this.code = code;
- }
- abstract public String getCode();
- public void setName(String name) {
- this.name = name;
- }
- abstract public String getName();
- public void setDescription(String description) {
- this.description = description;
- }
- abstract public String getDescription();
- abstract public Tree getParent();
- public boolean isRoot() {
- return (getParent()==null);
- }
- public boolean isLeaf() {
- return (this.getChildren().size()==0);
- }
- public boolean isParentOf(Tree tree) {
- if (tree==null || ((BaseTree) tree).equals(this)) {
- /*如果对方为空*/
- return false;
- }else if(this.isLeaf()){
- /*如果自己为叶子,则返回FALSE*/
- return false;
- }else if(tree.isRoot()){
- /*如果对方为根,返回FALSE*/
- return false;
- }else{
- BaseTree bt = (BaseTree) (tree.getParent());
- if (this.equals(bt)){
- /*如果对方的父节点是自己,则返回TRUE*/
- return true;
- }else{
- /*判断对方的父节点是否是自己的孩子,进行递归*/
- return isParentOf(bt);
- }
- }
- }
- public boolean isChildOf(Tree tree) {
- return (tree.isParentOf(this));
- }
- public void addChild(Tree tree) {
- children.add(tree);
- }
- public void rmChild(Tree tree) {
- children.remove(tree);
- ((BaseTree) tree).setParent(null);
- }
- public Set getAllLeaves() {
- Set set_old = this.getAllChildren();
- Set set = new HashSet();
- set.addAll(set_old);
- Iterator itr = set_old.iterator();
- while(itr.hasNext()){
- BaseTree bt = (BaseTree) itr.next();
- if (! bt.isLeaf()){
- set.remove(bt);
- }
- }
- return set;
- }
- public Set getAllChildren() {
- Set set = new HashSet();
- Stack stack = new Stack();
- stack.push(this);
- while(!stack.empty()){
- BaseTree bt = (BaseTree) stack.pop();
- set.add(bt);
- Iterator itr = bt.getChildren().iterator();
- while(itr.hasNext()){
- BaseTree btchild = (BaseTree) itr.next();
- stack.push(btchild);
- }
- }
- set.remove(this);
- return set;
- }
- public List getMeAndListAllChildren() {
- List lst = new Vector();
- lst.add(this);
- Iterator itr = this.getChildren().iterator();
- while(itr.hasNext()){
- BaseTree bt = (BaseTree) itr.next();
- lst.addAll(bt.getMeAndListAllChildren());
- }
- return lst;
- }
- abstract public Set getChildren();
- public void addObject(Object obj) {
- objects.add(obj);
- }
- public void rmObject(Object obj) {
- objects.remove(obj);
- }
- abstract public Set getObjects();
- public void setParent(Tree parent) {
- this.parent = (BaseTree) parent;
- }
- public void setChildren(Set children) {
- this.children = children;
- }
- public void setObjects(Set objects) {
- this.objects = objects;
- }
- }
【编辑推荐】