<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    空間站

    北極心空

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

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

    解決辦法:
    1. 通過在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)鍵字的,也可通過其他的諸如時(shí)間等進(jìn)行排序,相當(dāng)靈活,且代碼量不大。

    2. 使用idbag為關(guān)系表增加一個(gè)主鍵。
    <idbag>可以理解為人工的id生成器,就好像是實(shí)體類一樣!集合的每一行都有一個(gè)不同的人造關(guān)鍵字。但是,Hibernate沒有提供任何機(jī)制來讓你取得某個(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>


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

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

     

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

    在處理多對(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)  編輯  收藏 所屬分類: Hibernate
    主站蜘蛛池模板: 国产无遮挡吃胸膜奶免费看视频| 亚洲色大成网站www尤物| 在线视频免费国产成人| 7x7x7x免费在线观看| 一级毛片aa高清免费观看| 亚洲精品无码av片| 亚洲午夜在线一区| 久久精品国产亚洲av日韩| 久久亚洲国产成人影院网站| 日本无卡码免费一区二区三区| 91免费人成网站在线观看18| 国产啪精品视频网站免费尤物| 免费看一级一级人妻片| 极品色天使在线婷婷天堂亚洲| 亚洲自国产拍揄拍| 亚洲成人高清在线观看| 亚洲黄色免费电影| 亚洲国产精品久久久久婷婷软件| 不卡一卡二卡三亚洲| 久久久久一级精品亚洲国产成人综合AV区| 国产精品国产免费无码专区不卡| 成年网站免费视频A在线双飞| 精品国产污污免费网站aⅴ| 99免费在线观看视频| 老汉精品免费AV在线播放| 久久99热精品免费观看牛牛| a级毛片在线免费观看| 久久一区二区免费播放| 久久久受www免费人成| 少妇性饥渴无码A区免费 | 久久一区二区三区免费| 免费在线观看一区| 一个人看的www免费在线视频| 欧亚一级毛片免费看| a级毛片免费网站| 国产成人免费ā片在线观看老同学| 国产免费人成视频尤勿视频| 中国国产高清免费av片| 好紧我太爽了视频免费国产| 亚欧免费无码aⅴ在线观看| 18女人腿打开无遮掩免费|