空間站

          北極心空

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
          問題: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>


          感覺第二個方法是按照我為角色配置菜單的順序排序的,靈活性比較差,所以個人認為還是第一個方法比較好。

          這是網上所提供的解決方案。

           

          Hibernate在處理一對多,多對一雙向關聯時,用order-by應該就可以解決問題。

          在處理多對多時,用最上面的方法,當相等時就可能被覆蓋,這時就要有第二次比較。

          public class EnterComparator implements Comparator {

          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 Entertainment && o2 instanceof Entertainment) {

              cc = (((Entertainment) o1).getPosition())
                .compareTo(((Entertainment) o2).getPosition());
              if (cc == 0) {
               cc = (((Entertainment) o1).getId())
                 .compareTo(((Entertainment) o2).getId());
              }
             }
             return ((cc < 0) ? 1 : (cc > 0) ? -1 : 0);
          }
          }


          posted on 2008-06-19 10:37 蘆葦 閱讀(365) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 济宁市| 海宁市| 蕲春县| 卫辉市| 华安县| 许昌市| 什邡市| 西乌珠穆沁旗| 东海县| 卫辉市| 新丰县| 师宗县| 清水县| 玉田县| 扎赉特旗| 洮南市| 乌海市| 工布江达县| 西林县| 钦州市| 平原县| 安福县| 正镶白旗| 苗栗市| 马龙县| 建阳市| 康马县| 辰溪县| 安泽县| 茌平县| 安国市| 昭平县| 华阴市| 上高县| 天等县| 湄潭县| 玛沁县| 开原市| 阜宁县| 连云港市| 新蔡县|