本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7593792
建立时间:2006年5月29日




[Hibernate]Hibernate中双向关联加载排序的解决方案
软件技术

lhwork 发表于 2007/1/20 10:58:47

问题:Hibernate的<many-to-many>双向关联中,一方加载另一方时,怎么样达到按自定义规则排序的目的呢? 实例:角色和菜单是多对多的关系,为角色分配菜单后,加载菜单时,我需要按照菜单的ID来排序显示。 解决办法: 1. 通过在hbm配置文件中配置解决,需要自定义比较器。   1) 在多对多的主控端指定sort属性   这里的主控端为role,受控端为menu。   role的配置为:  500)this.width=500'><set name="roleMenus" table="ROLE_MENU" inverse="false" lazy="false" sort="menu.MenuComparator">500)this.width=500'>   <key column="RM_ROLE_ROLE_ID" />500)this.width=500'>   <many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" /> 500)this.width=500'>  </set>menu的配置为:500)this.width=500'><set name="roleMenus" table="ROLE_MENU">500)this.width=500'>   <key column="RM_MENU_MENU_ID" />500)this.width=500'>   <many-to-many column="RM_ROLE_ROLE_ID" class="domain.RoleInfoVO" /> 500)this.width=500'>  </set>2) 自定义MenuComparator  这里需要实现Comparator接口,自定义比较器500)this.width=500'>500)this.width=500'>/** *//**500)this.width=500'> * 菜单排序比较器500)this.width=500'> * MenuComparator500)this.width=500'> * @author allen500)this.width=500'> */500)this.width=500'>500)this.width=500'>public class MenuComparator implements Comparator 500)this.width=500'>{500)this.width=500'>    500)this.width=500'>500)this.width=500'>    /** *//**500)this.width=500'>     * 按照菜单的ID进行排序 500)this.width=500'>     * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)500)this.width=500'>     */500)this.width=500'>500)this.width=500'>    public int compare(Object o1, Object o2) 500)this.width=500'>{500)this.width=500'>500)this.width=500'>        if(o1 == null)500)this.width=500'>{   500)this.width=500'>            return (o2 == null) ? 0 : 1;   500)this.width=500'>        }   500)this.width=500'>500)this.width=500'>        if(o2 == null)500)this.width=500'>{   500)this.width=500'>            return -1;   500)this.width=500'>        }500)this.width=500'>        int cc = 0;500)this.width=500'>500)this.width=500'>        if (o1 instanceof MenuInfoVO && o2 instanceof MenuInfoVO) 500)this.width=500'>{500)this.width=500'>            500)this.width=500'>            cc = (((MenuInfoVO)o1).getId()).compareTo(((MenuInfoVO)o2).getId());500)this.width=500'>        }500)this.width=500'>        return ((cc < 0) ? -1 : (cc > 0) ? 1 : 0);500)this.width=500'>    }500)this.width=500'>}500)this.width=500'>我在这里是以菜单的ID为排序关键字的,也可通过其他的诸如时间等进行排序,相当灵活,且代码量不大。2. 使用idbag为关系表增加一个主键。 <idbag>可以理解为人工的id生成器,就好像是实体类一样!集合的每一行都有一个不同的人造关键字。但是,Hibernate没有提供任何机制来让你取得某个特定行的人造关键字。注意<idbag>的更新性能要比普通的<bag>高得多!Hibernate可以有效的定位到不同的行,分别进行更新或删除工作,就如同处理一个list, map或者set一样。500)this.width=500'><idbag name="roleMenus" table="ROLE_MENU" order-by="RM_MENU_MENU_ID desc">  500)this.width=500'>    <meta attribute="field-description">菜单列表</meta>  500)this.width=500'>        <collection-id column="id" type="java.lang.Long">  500)this.width=500'>          <meta attribute="field-description">主键</meta>  500)this.width=500'>          <generator />  500)this.width=500'>        </collection-id>  500)this.width=500'>        <key column="RM_ROLE_ROLE_ID"/>  500)this.width=500'>        <many-to-many column="RM_MENU_MENU_ID" class="domain.MenuInfoVO" />  500)this.width=500'></idbag> 感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个方法比较好。


阅读全文(2971) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.352 second(s), page refreshed 144767091 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号