詳解Hibernate樹形結構
本文向大家介紹Hibernate樹形結構,可能好多人還不了解Hibernate樹形結構,沒有關系,看完本文你肯定有不少收獲,希望本文能教會你更多東西。
在系統(tǒng)中,經(jīng)常會用到無限級的Hibernate樹形結構分類,如組織機構管理、商品/地區(qū)分類等等。一般無外采用兩種方式:
◆一是類似struts-menu的XML文件管理方式,配置起來比較方便,但很難與系統(tǒng)中其它應用數(shù)據(jù)集成;
◆二是使用數(shù)據(jù)庫存儲,定義父子關系。
在我們現(xiàn)在開發(fā)的一個產(chǎn)品中,實現(xiàn)了一套Hibernate樹形結構的處理方法,簡介如下:
一.Hibernate樹形結構顯示
使用的是xtree。為便于編輯維護,自己寫了一個左鍵彈出菜單(xtree的右鍵事件無法更改),進行節(jié)點的添加、修改、刪除、轉移操作。(PS:這套維護界面是完全跨瀏覽器的,有興趣的不妨一試)
二.關聯(lián)關系:
可以使用objects對象來配置關聯(lián)關系,實現(xiàn)多對多/一對多等關系。在BaseTree中,getObjects()方法是abstract的,可以根據(jù)需要自己定義。如論壇分類與每個分類所對應的貼子相關聯(lián),商品分類與商品編碼相關聯(lián)等,可以根據(jù)需要來處理hbm文件。若需要多項關聯(lián),亦可擴展。如菜單與用戶、部門、崗位分別進行關聯(lián)
三.主要代碼:
- 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)){
- /*如果對方的父節(jié)點是自己,則返回TRUE*/
- return true;
- }else{
- /*判斷對方的父節(jié)點是否是自己的孩子,進行遞歸*/
- 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;
- }
- }
【編輯推薦】