在我們現(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 代碼
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注