国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

使用hibernate實(shí)現(xiàn)樹形結(jié)構(gòu)無限級(jí)分類

2019-11-18 15:27:11
字體:
供稿:網(wǎng)友

  在系統(tǒng)中,經(jīng)常會(huì)用到無限級(jí)的樹形結(jié)構(gòu)分類,如組織機(jī)構(gòu)治理、商品/地區(qū)分類等等。一般無外采用兩種方式:

  一是類似struts-menu(http://struts-menu.sourceforge.net)的xml文件治理方式,配置起來比較方便,但很難與系統(tǒng)中其它應(yīng)用數(shù)據(jù)集成;

  二是使用數(shù)據(jù)庫存儲(chǔ),定義父子關(guān)系。

  在我們現(xiàn)在開發(fā)的一個(gè)產(chǎn)品中,使用hibernate實(shí)現(xiàn)了一套樹形結(jié)構(gòu)的處理方法,簡介如下:

  ■演示地址:http://219.143.69.2:8000/treetest/menumanage.do?todoaction=list

  演示的是系統(tǒng)菜單的層次實(shí)現(xiàn)。由于菜單本身屬于權(quán)限系統(tǒng)的一部分,存儲(chǔ)在數(shù)據(jù)庫中后可以方便的與部門、用戶、崗位、職務(wù)等進(jìn)行關(guān)聯(lián),并進(jìn)行權(quán)限控制。

  ■樹形結(jié)構(gòu)顯示,使用的是xtree。為便于編輯維護(hù),自己寫了一個(gè)左鍵彈出菜單(xtree的右鍵事件無法更改),進(jìn)行節(jié)點(diǎn)的添加、修改、刪除、轉(zhuǎn)移操作。(PS:這套維護(hù)界面是完全跨瀏覽器的,有愛好的不妨一試)

  ■關(guān)聯(lián)關(guān)系

  可以使用objects對(duì)象來配置關(guān)聯(lián)關(guān)系,實(shí)現(xiàn)多對(duì)多/一對(duì)多等關(guān)系。在BaseTree中,getObjects()方法是abstract的,可以根據(jù)需要自己定義。如論壇分類與每個(gè)分類所對(duì)應(yīng)的貼子相關(guān)聯(lián),商品分類與商品編碼相關(guān)聯(lián)等,可以根據(jù)需要來處理hbm文件。若需要多項(xiàng)關(guān)聯(lián),亦可擴(kuò)展。如菜單與用戶、部門、崗位分別進(jìn)行關(guān)聯(lián)

  ■hibernate2.1.7的一個(gè)bug,在這個(gè)測試源碼的dao中,TreeManager的getRoots方法,
session.createQuery(" from " + cls.getName() + " where enabled=? and parent_id is null order by id");
在hibernate2中必須像寫成parent_id is null,才能正確運(yùn)行,這應(yīng)該是2.1.7中的一個(gè)bug。而hibernate3中,可以使用parent is null的hsql。 

  ■主要代碼

  繼續(xù)關(guān)系如下,假如要實(shí)現(xiàn)國家分類:

CountryTree extends BaseTree(abstract class)
          BaseTree(abstract class) implements Tree(interface)

  為節(jié)省版面,下面代碼去掉了javadoc

  Tree.java 代碼

  1. /**  
  2.  * 實(shí)現(xiàn)了樹的基本操作,上溯、下溯、子節(jié)點(diǎn)的添加/移除和遞歸查找、對(duì)象關(guān)聯(lián)等  
  3.  */  
  4. package test.testtree.base;   
  5. import java.util.Set;   
  6.   
  7. public interface Tree {    
  8.     public String getCode();   
  9.     public String getName();   
  10.     public String getDescription();   
  11.     public Tree getParent();   
  12.     public boolean isRoot();   
  13.     public boolean isLeaf();   
  14.     public boolean isParentOf(Tree tree);   
  15.     public boolean isChildOf(Tree tree);   
  16.     public void addChild(Tree tree);   
  17.     public void rmChild(Tree tree);   
  18.     public Set getAllChildren();   
  19.     public Set getChildren();   
  20.     public Set getAllLeaves();   
  21.     public void addObject(Object obj);   
  22.     public void rmObject(Object obj);   
  23.     public Set getObjects();   
  24.     public Long getId();   
  25. }   



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临夏县| 永靖县| 商丘市| 龙口市| 印江| 贵州省| 长寿区| 南郑县| 通化市| 赤城县| 修水县| 辽宁省| 巴塘县| 松潘县| 海林市| 阳谷县| 青岛市| 应城市| 松江区| 饶阳县| 巫溪县| 高安市| 宜都市| 顺义区| 洪湖市| 抚宁县| 梁平县| 汕尾市| 高邑县| 泰顺县| 德庆县| 澜沧| 巩留县| 锦州市| 阿鲁科尔沁旗| 白城市| 鲁山县| 将乐县| 古浪县| 如皋市| 曲阜市|