氟塑料離心泵www.buybeng.com

          jquery教程http://www.software8.co/wzjs/jquery/

          對(duì)于java的樹形結(jié)構(gòu)的抽象與拓展

          近來幾日,在學(xué)習(xí)hibernate,在做練習(xí)的時(shí)候,想做一個(gè)樹形結(jié)構(gòu)出來,比如組織架構(gòu),于是開始動(dòng)手去嘗試,首先是利用hibernate自己的方式做一棵樹,于是開始動(dòng)手構(gòu)建persisten object,代碼如下:

           

          Java代碼  
          1. package com.zq.po;  
          2.   
          3. import javax.persistence.*;  
          4. import java.util.List;  
          5.   
          6.   
          7. @Entity  
          8. @Table(name = "t_modual")  
          9. public class Modual2 {  
          10.     private long dbid;  
          11.     private String nane;  
          12.     private String url;  
          13.     private Modual2 parent;  
          14.     private List<Modual2> children;  
          15.   
          16.     public Modual2() {  
          17.     }  
          18.     @Id  
          19.     @GeneratedValue(strategy = GenerationType.IDENTITY)  
          20.     public long getDbid() {  
          21.         return dbid;  
          22.     }  
          23.   public void setDbid(long dbid) {  
          24.         this.dbid = dbid;  
          25.     }  
          26.   
          27.     public String getNane() {  
          28.         return nane;  
          29.     }  
          30.   
          31.     public void setNane(String nane) {  
          32.         this.nane = nane;  
          33.     }  
          34.   
          35.     public String getUrl() {  
          36.         return url;  
          37.     }  
          38.   
          39.     public void setUrl(String url) {  
          40.         this.url = url;  
          41.     }  
          42.     @ManyToOne  
          43.     @JoinColumn(name = "parent_id")  
          44.     public Modual2 getParent() {  
          45.         return parent;  
          46.     }  
          47.     public void setParent(Modual2 parent) {  
          48.        this.parent = parent;  
          49.     }  
          50.     @OneToMany(mappedBy = "parent",cascade = CascadeType.ALL,fetch = FetchType.EAGER)  
          51.     public List<Modual2> getChildren() {  
          52.         return children;  
          53.     }  
          54.   
          55.     public void setChildren(List<Modual2> children) {  
          56.         this.children = children;  
          57.     }  
          58. }  

                 然后利用代碼聲生成結(jié)構(gòu),但是這樣一來,生成的表中,parent_id是強(qiáng)制關(guān)聯(lián)自己表的主鍵的,感覺這樣不是很靈活,于是就想著,把外鍵約束去掉,轉(zhuǎn)而在程序里控制好,這樣靈活性提高了。想想在工作中遇到的樹形結(jié)構(gòu)的表設(shè)計(jì)中,也沒有加入外鍵約束,所以我就開始構(gòu)建一個(gè)沒有外鍵約束的樹形結(jié)構(gòu)。

                經(jīng)過思考,我決定使用如下的方式實(shí)現(xiàn):抽象出一個(gè)BaseTree來,里面有主鍵,父親節(jié)點(diǎn)的ID,父親節(jié)點(diǎn)的對(duì)象和兒子節(jié)點(diǎn)的集合,這基本上是所有樹形結(jié)構(gòu)都共有的特性,所以抽象出來,讓其他的樹去繼承,然后讓程序員更加關(guān)注本樹的業(yè)務(wù)字段。抽象出來的BaseTree代碼如下:   

           

          Java代碼  
          1. package com.zq.po;  
          2.   
          3. import java.util.List;  
          4.   
          5.   
          6. public class BaseTree<T> {  
          7.     private long dbid;  
          8.     private long parentId;  
          9.     private T parent;  
          10.     private List<T> children;  
          11.   
          12.    public long getDbid() {  
          13.         return dbid;  
          14.     }  
          15.   
          16.     public void setDbid(long dbid) {  
          17.         this.dbid = dbid;  
          18.     }  
          19.   
          20.     public long getParentId() {  
          21.         return parentId;  
          22.     }  
          23.   
          24.     public void setParentId(long parentId) {  
          25.         this.parentId = parentId;  
          26.     }  
          27.   
          28.     public T getParent() {  
          29.         return parent;  
          30.     }  
          31.   
          32.     public void setParent(T parent) {  
          33.         this.parent = parent;  
          34.     }  
          35.   
          36.     public List<T> getChildren() {  
          37.         return children;  
          38.   }  
          39.   
          40.     public void setChildren(List<T> children) {  
          41.         this.children = children;  
          42.     }  
          43. }  

                   然后再創(chuàng)建一棵樹,讓他繼承BaseTree,但是需要重寫主鍵和父節(jié)點(diǎn)ID這兩個(gè)屬性,因?yàn)樾枰阉麄冇成涞綌?shù)據(jù)庫里面去,代碼如下:

           

          Java代碼  
          1. package com.zq.po;  
          2.   
          3. import javax.persistence.*;  
          4. import java.util.List;  
          5.   
          6.   
          7. @Entity  
          8. @Table(name="t_orga")  
          9. public class Organization  extends BaseTree<Organization>{  
          10.     private long dbid;  
          11.     private long parentId;  
          12.     private String name;  
          13.     private int count;  
          14.     //private Organization parent;  
          15.     //private List<Organization> children;  
          16.   
          17.     public Organization() {  
          18.     }  
          19.     @Id  
          20.     @GeneratedValue(strategy = GenerationType.IDENTITY)  
          21.     public long getDbid() {  
          22.         return dbid;  
          23.     }  
          24.   
          25.     public void setDbid(long dbid) {  
          26.         this.dbid = dbid;  
          27.     }  
          28.   
          29.     public String getName() {  
          30.         return name;  
          31.     }  
          32.   
          33.     public void setName(String name) {  
          34.         this.name = name;  
          35.     }  
          36.   
          37.     public int getCount() {  
          38.         return count;  
          39.     }  
          40.   
          41.     public void setCount(int count) {  
          42.         this.count = count;  
          43.     }   
          44.     public long getParentId() {  
          45.         return parentId;  
          46.     }  
          47.   
          48.     public void setParentId(long parentId) {  
          49.         this.parentId = parentId;  
          50.     }  
          51.     /*@Transient 
          52.     public Organization getParent() { 
          53.         return parent; 
          54.     } 
          55.  
          56.     public void setParent(Organization parent) { 
          57.         this.parent = parent; 
          58.     } 
          59.     @Transient 
          60.     public List<Organization> getChildren() { 
          61.         return children; 
          62.     } 
          63.  
          64.     public void setChildren(List<Organization> children) { 
          65.         this.children = children; 
          66.     }*/  
          67. }  

                這樣,模型就出來了,創(chuàng)建出來的表結(jié)構(gòu)如下圖:完全沒有了外鍵約束符合要求:

                 

           

                  雖然是模型和表都整出來了,但是有一個(gè)問題,當(dāng)我們把所有的樹節(jié)點(diǎn)都查詢出來的時(shí)候,他們自身只有一個(gè)父節(jié)點(diǎn)的ID,想訪問他的父節(jié)點(diǎn)或者是孩子節(jié)點(diǎn),需要拿著該節(jié)點(diǎn)的主鍵查孩子節(jié)點(diǎn)或者拿著patentId查父親節(jié)點(diǎn),很是麻煩,于是就想著整一個(gè)工具類,把全查出來的節(jié)點(diǎn)的父親和兒子都匹配上,目前只是完成了全部節(jié)點(diǎn)的匹配,以后還會(huì)完成某一個(gè)節(jié)點(diǎn)的匹配。建了一個(gè)工具類,代碼如下:

           

          Java代碼  
          1. public class BaseTreeUtil extends BaseTree {  
          2.     private BaseTree baseTree1;  
          3.     private BaseTree baseTree2;  
          4.   
          5.     public List allInit(List param)  {  
          6.         //找老子  
          7.         for (int i = 0; i < param.size(); i++) {  
          8.             baseTree1 = (BaseTree) param.get(i);  
          9.             if (baseTree1.getParentId() == -1) {  
          10.                 break;  
          11.             } else {  
          12.                 for (int j = 0; j < param.size(); j++) {  
          13.                     baseTree2 = (BaseTree) param.get(j);  
          14.                     if (baseTree2.getDbid() == baseTree1.getParentId()) {  
          15.                         baseTree2.setParent(baseTree1);  
          16.                     }  
          17.                 }  
          18.             }  
          19.         }  
          20.         //找兒子  
          21.         for (int k = 0; k < param.size(); k++) {  
          22.             baseTree1 = (BaseTree) param.get(k);  
          23.             List<BaseTree> sons = new ArrayList<BaseTree>();  
          24.             for (int l = 0; l < param.size(); l++) {  
          25.                 baseTree2 = (BaseTree) param.get(l);  
          26.                 if (baseTree1.getDbid() == baseTree2.getParentId()) {  
          27.                     sons.add(baseTree2);  
          28.                 }  
          29.             }  
          30.             baseTree1.setChildren(sons);  
          31.         }  
          32.         return param;  
          33.     }  
          34.   
          35. }  

                這樣就是把查出來的節(jié)點(diǎn)做循環(huán),先是給每個(gè)節(jié)點(diǎn)的找到父親節(jié)點(diǎn),然后在給每個(gè)節(jié)點(diǎn)去找兒子節(jié)點(diǎn)。

               附上一段測(cè)試代碼(片段):

          Java代碼  
          1. public static void print(Organization orga, int level) {  
          2.      String show = "";  
          3.      for (int i = 0; i < level; i++) {  
          4.          show += "----";  
          5.      }  
          6.      System.out.println(show + orga.getName());  
          7.      level++;  
          8.      for (Organization children : orga.getChildren()) {  
          9.          print(children, level);  
          10.      }  
          11.  }  
          12.  @Test  
          13.  public void testSelect02() {  
          14.      Session session = this.before();  
          15.      Transaction tx = session.beginTransaction();  
          16.   
          17.      Query query =session.createQuery("from Organization ");  
          18.      List<Organization> list=query.list();  
          19.      List list2= new BaseTreeUtil().allInit(list);  
          20.   
          21.      print((Organization)list2.get(0), 0);  
          22.   
          23.      this.after(tx);  
          24.   
          25.   
          26.  }  

              不好意思,忘記附上表的數(shù)據(jù)了,補(bǔ)上:



           
            最后測(cè)試的結(jié)果如下:

           

           

           到此,基本的功能都已經(jīng)實(shí)現(xiàn)了,剩下需要做的有如下幾個(gè):

                  1、晚上BaseTreeUtil的功能

                  2、把以上內(nèi)容應(yīng)用到DAO層的編寫中,整合到spring進(jìn)行測(cè)試

            后續(xù)工作的總結(jié)寫在下次日志中。
          原文鏈接:
          http://www.software8.co/wzjs/java/3335.html

          posted on 2013-03-13 17:33 你爸是李剛 閱讀(1925) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          <2013年3月>
          242526272812
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          技術(shù)網(wǎng)站

          行業(yè)網(wǎng)站

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          站長(zhǎng)網(wǎng) 氟塑料離心泵 注塑機(jī) 液晶廣告機(jī)
          主站蜘蛛池模板: 依兰县| 喀喇沁旗| 永州市| 墨竹工卡县| 昭苏县| 城步| 淮阳县| 新龙县| 新巴尔虎右旗| 田阳县| 邵阳市| 迭部县| 涡阳县| 民县| 德清县| 颍上县| 资溪县| 崇明县| 玉田县| 双辽市| 吉林省| 麻阳| 洛宁县| 洪洞县| 红桥区| 临颍县| 山丹县| 郯城县| 同心县| 常山县| 河池市| 弥勒县| 大连市| 陆川县| 盐池县| 嘉善县| 辽宁省| 太康县| 兴业县| 武鸣县| 开封县|