posts - 40,  comments - 187,  trackbacks - 0
          問題:Hibernate的<many-to-many>雙向關聯中,一方加載另一方時,怎么樣達到按自定義規則排序的目的呢?

          實例:角色和菜單是多對多的關系,為角色分配菜單后,加載菜單時,我需要按照菜單的ID來排序顯示。

          解決辦法:
          1. 通過在hbm配置文件中配置解決,需要自定義比較器。
          ? 1) 在多對多的主控端指定sort屬性
          ? 這里的主控端為role,受控端為menu。
          ? role的配置為:
          ?
          <set?name="roleMenus"?table="ROLE_MENU"?inverse="false"?lazy="false"?sort="menu.MenuComparator">
          ???
          <key?column="RM_ROLE_ROLE_ID"?/>
          ???
          <many-to-many?column="RM_MENU_MENU_ID"?class="domain.MenuInfoVO"?/>?
          ??
          </set>

          menu的配置為:
          <set?name="roleMenus"?table="ROLE_MENU">
          ???
          <key?column="RM_MENU_MENU_ID"?/>
          ???
          <many-to-many?column="RM_ROLE_ROLE_ID"?class="domain.RoleInfoVO"?/>?
          ??
          </set>

          2) 自定義MenuComparator
          ? 這里需要實現Comparator接口,自定義比較器
          /**
          ?*?菜單排序比較器
          ?*?MenuComparator
          ?*?
          @author?allen
          ?
          */

          public?class?MenuComparator?implements?Comparator?{
          ????
          ????
          /**
          ?????*?按照菜單的ID進行排序?
          ?????*?
          @see?java.util.Comparator#compare(java.lang.Object,?java.lang.Object)
          ?????
          */

          ????
          public?int?compare(Object?o1,?Object?o2)?{
          ????????
          if(o1?==?null){???
          ????????????
          return?(o2?==?null)???0?:?1;???
          ????????}
          ???
          ????????
          if(o2?==?null){???
          ????????????
          return?-1;???
          ????????}

          ????????
          int?cc?=?0;
          ????????
          if?(o1?instanceof?MenuInfoVO?&&?o2?instanceof?MenuInfoVO)?{
          ????????????
          ????????????cc?
          =?(((MenuInfoVO)o1).getId()).compareTo(((MenuInfoVO)o2).getId());
          ????????}

          ????????
          return?((cc?<?0)???-1?:?(cc?>?0)???1?:?0);
          ????}

          }


          我在這里是以菜單的ID為排序關鍵字的,也可通過其他的諸如時間等進行排序,相當靈活,且代碼量不大。

          2. 使用idbag為關系表增加一個主鍵。
          ?
          <idbag>可以理解為人工的id生成器,就好像是實體類一樣!集合的每一行都有一個不同的人造關鍵字。但是,Hibernate沒有提供任何機制來讓你取得某個特定行的人造關鍵字。注意<idbag>的更新性能要比普通的<bag>高得多!Hibernate可以有效的定位到不同的行,分別進行更新或刪除工作,就如同處理一個list, map或者set一樣。
          <idbag?name="roleMenus"?table="ROLE_MENU"?order-by="RM_MENU_MENU_ID?desc">??
          ????
          <meta?attribute="field-description">菜單列表</meta>??
          ????????
          <collection-id?column="id"?type="java.lang.Long">??
          ??????????
          <meta?attribute="field-description">主鍵</meta>??
          ??????????
          <generator?/>??
          ????????
          </collection-id>??
          ????????
          <key?column="RM_ROLE_ROLE_ID"/>??
          ????????
          <many-to-many?column="RM_MENU_MENU_ID"?class="domain.MenuInfoVO"?/>??
          </idbag>?

          感覺第二個方法是按照我為角色配置菜單的順序排序的,靈活性比較差,所以個人認為還是第一個方法比較好。
          posted on 2007-01-18 16:25 小立飛刀 閱讀(3712) 評論(6)  編輯  收藏 所屬分類: Hibernate

          FeedBack:
          # re: Hibernate中雙向關聯加載排序的解決方案
          2007-01-22 13:24 | 網絡電話
          不錯,多謝  回復  更多評論
            
          # re: Hibernate中雙向關聯加載排序的解決方案
          2007-01-22 17:35 | 小雪飛刀
          不客氣  回復  更多評論
            
          # re: Hibernate中雙向關聯加載排序的解決方案[未登錄]
          2007-07-30 18:08 | aaron
          問個hibernate的問題:
          類User和類Group是多對一的關系
          數據庫中有user表和group表
          group表中有id,name,address等字段。
          數據庫表user中有個groupId字段用來表明該user是屬于哪個group。

          要在程序中查詢user,要求按其所屬的group名字長度降序排列,請問該如何查詢呢?
            回復  更多評論
            
          # re: Hibernate中雙向關聯加載排序的解決方案
          2007-07-31 14:35 | 小雪飛刀
          @aaron

          沒仔細研究,但認為可以寫了比較器實現您所說的功能。用比較器比較GROUP的名字長度,按降序輸出。在加載GROUP后顯示用戶,之下的用戶就會按照所述功能排序。
            回復  更多評論
            
          # re: Hibernate中雙向關聯加載排序的解決方案
          2008-04-21 16:13 | 謝謝
          很詳細 ,謝謝  回復  更多評論
            
          # re: Hibernate中雙向關聯加載排序的解決方案
          2008-04-21 16:42 | 小立飛刀
          @謝謝

          客氣了
            回復  更多評論
            
          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          生存或毀滅,這是個必答之問題:是否應默默的忍受坎苛命運之無情打擊,還是應與深如大海之無涯苦難奮然為敵,并將其克服。此二抉擇,究竟是哪個較崇高?

          常用鏈接

          留言簿(12)

          隨筆分類(43)

          相冊

          收藏夾(7)

          朋友的博客

          電子資料

          搜索

          •  

          積分與排名

          • 積分 - 302763
          • 排名 - 192

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 离岛区| 枝江市| 桃园市| 饶阳县| 宜宾县| 德令哈市| 朝阳市| 乐陵市| 汝城县| 梓潼县| 措勤县| 盈江县| 林周县| 乐都县| 施甸县| 西安市| 台山市| 龙山县| 乐清市| 赞皇县| 广汉市| 建瓯市| 徐水县| 南岸区| 扎鲁特旗| 迭部县| 寻乌县| 北京市| 鄢陵县| 天津市| 鄂州市| 大名县| 都昌县| 合川市| 米泉市| 内丘县| 扎鲁特旗| 江永县| 上林县| 鄂温| 论坛|