快速业务通道

Hibernate中双向关联加载排序的解决方案 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

Hibernate中双向关联加载排序的解决方案

时间:2011-08-13

问题: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为排序关键字的,也可通过其他的诸如时间等进行排序,相当灵活,且代码量不大。

Hibernate中双向关联加载排序的解决方案(2)

时间:2011-08-13

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>

感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个方法比较好。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号