Hibernate 中對set的集合的排序解決辦法

問題: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 >  

感覺第二個方法是按照我爲角色配置菜單的順序排序的,靈活性比較差,所以個人認爲還是第一個 方法比較好。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章