空間站

          北極心空

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
          問(wèn)題:Hibernate的<many-to-many>雙向關(guān)聯(lián)中,一方加載另一方時(shí),怎么樣達(dá)到按自定義規(guī)則排序的目的呢?

          實(shí)例:角色和菜單是多對(duì)多的關(guān)系,為角色分配菜單后,加載菜單時(shí),我需要按照菜單的ID來(lái)排序顯示。

          解決辦法:
          1. 通過(guò)在hbm配置文件中配置解決,需要自定義比較器。
          1) 在多對(duì)多的主控端指定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
          這里需要實(shí)現(xiàn)Comparator接口,自定義比較器
          /** *//**
          * 菜單排序比較器
          * MenuComparator
          *
          @author allen
          */

          public class MenuComparator implements Comparator {
              
              
          /** *//**
                * 按照菜單的ID進(jìn)行排序
                *
          @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為排序關(guān)鍵字的,也可通過(guò)其他的諸如時(shí)間等進(jìn)行排序,相當(dāng)靈活,且代碼量不大。

          2. 使用idbag為關(guān)系表增加一個(gè)主鍵。
          <idbag>可以理解為人工的id生成器,就好像是實(shí)體類(lèi)一樣!集合的每一行都有一個(gè)不同的人造關(guān)鍵字。但是,Hibernate沒(méi)有提供任何機(jī)制來(lái)讓你取得某個(gè)特定行的人造關(guān)鍵字。注意<idbag>的更新性能要比普通的<bag>高得多!Hibernate可以有效的定位到不同的行,分別進(jìn)行更新或刪除工作,就如同處理一個(gè)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>


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

          這是網(wǎng)上所提供的解決方案。

           

          Hibernate在處理一對(duì)多,多對(duì)一雙向關(guān)聯(lián)時(shí),用order-by應(yīng)該就可以解決問(wèn)題。

          在處理多對(duì)多時(shí),用最上面的方法,當(dāng)相等時(shí)就可能被覆蓋,這時(shí)就要有第二次比較。

          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) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Hibernate
          主站蜘蛛池模板: 平阴县| 马山县| 大安市| 浦城县| 修文县| 习水县| 保定市| 宿松县| 新疆| 漳浦县| 青河县| 山西省| 漠河县| 长子县| 大城县| 手游| 香格里拉县| 平果县| 南丰县| 沾化县| 宁武县| 九寨沟县| 鄄城县| 平湖市| 南华县| 丹阳市| 陵川县| 桂东县| 彭水| 阳新县| 沙田区| 东兴市| 承德县| 巨野县| 翁源县| 崇礼县| 商都县| 南开区| 阿坝| 五原县| 扶余县|