Welcome 微信登录

首页 / 软件开发 / JAVA / Hibernate中双向关联加载排序的解决方案

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