posts - 40,  comments - 187,  trackbacks - 0
问题: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> 

感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个方法比较好。
posted on 2007-01-18 16:25 小立飞刀 阅读(3704) 评论(6)  编辑  收藏 所属分类: Hibernate

FeedBack:
# re: Hibernate中双向关联加载排序的解决方案
2007-01-22 13:24 | 网络电话
不错,多谢  回复  更多评论
  
# re: Hibernate中双向关联加载排序的解决方案
2007-01-22 17:35 | 小雪飞刀
不客气  回复  更多评论
  
# re: Hibernate中双向关联加载排序的解决方案[未登录]
2007-07-30 18:08 | aaron
问个hibernate的问题:
类User和类Group是多对一的关系
数据库中有user表和group表
group表中有id,name,address等字段。
数据库表user中有个groupId字段用来表明该user是属于哪个group。

要在程序中查询user,要求按其所属的group名字长度降序排列,请问该如何查询呢?
  回复  更多评论
  
# re: Hibernate中双向关联加载排序的解决方案
2007-07-31 14:35 | 小雪飞刀
@aaron

没仔细研究,但认为可以写了比较器实现您所说的功能。用比较器比较GROUP的名字长度,按降序输出。在加载GROUP后显示用户,之下的用户就会按照所述功能排序。
  回复  更多评论
  
# re: Hibernate中双向关联加载排序的解决方案
2008-04-21 16:13 | 谢谢
很详细 ,谢谢  回复  更多评论
  
# re: Hibernate中双向关联加载排序的解决方案
2008-04-21 16:42 | 小立飞刀
@谢谢

客气了
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年1月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

生存或毁灭,这是个必答之问题:是否应默默的忍受坎苛命运之无情打击,还是应与深如大海之无涯苦难奋然为敌,并将其克服。此二抉择,究竟是哪个较崇高?

常用链接

留言簿(12)

随笔分类(43)

相册

收藏夹(7)

朋友的博客

电子资料

搜索

  •  

积分与排名

  • 积分 - 301826
  • 排名 - 192

最新评论

阅读排行榜

评论排行榜