Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > Hibernate中双向关联加载排序的解决方案
【标  题】:Hibernate中双向关联加载排序的解决方案
【关键字】:Hibernate
【来  源】:http://www.blogjava.net/allen-zhe/archive/2007/01/18/94692.html

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

Your Ad Here
问题: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>?

感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个方法比较好。
IBatis的分页研究:【上一篇】
如何使 Eclipse(SWT 程序)能够使用 XP 系统外观?:【下一篇】
【相关文章】
  • hibernate查询语句---HQL
  • struts+spring+hibernate感悟
  • 学习Java6(六) 嵌入式数据库Derby(8)Derby+spring+hibernate
  • Hibernate/Spring/Struts架构使用OpenSessionInView的问题
  • spring hibernate struts整合开发实例
  • nhibernate
  • Hibernate大数据量操作解决方案
  • 触发器对记录的更改操作引起Nhibernate异常的解决
  • 一个有用的NHibernate工具类NHibernateUtil (其它版本)
  • hibernate many-to-many saveOrUpdate merge 的选用
  • 【随机文章】
  • 如何使用Oracle的BFILE
  • 消灭内存的隐形杀手(1)
  • 轻松搞定病毒第八步 病毒的检测
  • 不用光驱软驱,硬盘安装 Fedora Core 5 (或 RHEL 4)
  • 康托尔、哥德尔、图灵——永恒的金色对角线
  • Linux 进程管理
  • ASP漏洞分析和解决方法(9)
  • How to use MTDJFFs2(中文)(zt)
  • “恶鹰”病毒变种K分析报告(2)
  • 嵌套方法调用
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.