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

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

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

    空間站

    北極心空

      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
    主站蜘蛛池模板: 亚洲免费日韩无码系列| 国产免费人成视频在线观看| 国产亚洲综合久久系列| 乱人伦中文视频在线观看免费| 毛片免费vip会员在线看| 日韩亚洲不卡在线视频中文字幕在线观看| 99精品一区二区免费视频| 亚洲精品视频在线| 18以下岁毛片在免费播放| 亚洲国产成人九九综合| 日韩一区二区a片免费观看 | 在线观看无码的免费网站| 四虎必出精品亚洲高清| 好爽…又高潮了免费毛片| 亚洲中文字幕日本无线码| 免费无码又爽又刺激高潮的视频 | 久久久免费的精品| 亚洲国产日韩在线人成下载| 日韩免费一区二区三区在线 | 女人隐私秘视频黄www免费| 亚洲国产精品VA在线看黑人| 91精品全国免费观看含羞草| 精品久久亚洲中文无码| 免费人成在线观看网站品爱网日本| 爱情岛论坛免费视频| 亚洲国产精品无码久久久不卡 | 在线观看亚洲视频| 中文字幕久久亚洲一区| 最近免费中文字幕大全免费 | 亚洲AV福利天堂一区二区三| 免费成人福利视频| 男女超爽视频免费播放| 亚洲AV综合色区无码一区| 在线v片免费观看视频| 一边摸一边爽一边叫床免费视频| 亚洲AV永久无码精品成人| 日韩国产免费一区二区三区| 日韩毛片在线免费观看| 91亚洲国产成人久久精品网站| 日本高清免费aaaaa大片视频| a级片免费观看视频|