`

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

阅读更多
问题: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 >


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

这是网上所提供的解决方案。

 

Hibernate在处理一对多,多对一双向关联时,用order-by应该就可以解决问题。

在处理多对多时,用最上面的方法,当相等时就可能被覆盖,这时就要有第二次比较。

public class EnterComparator implements Comparator {

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 Entertainment && o2 instanceof Entertainment) {

    cc = (((Entertainment) o1).getPosition())
      .compareTo(((Entertainment) o2).getPosition());
    if (cc == 0) {
     cc = (((Entertainment) o1).getId())
       .compareTo(((Entertainment) o2).getId());
    }
   }
   return ((cc < 0) ? 1 : (cc > 0) ? -1 : 0);
}
}

分享到:
评论

相关推荐

    hibernate面试题2

    - Hibernate简化了数据访问层的代码,提供ORM(对象关系映射)解决方案,增强了反射机制,性能优秀,支持多种关系映射。 6. **延迟加载(Lazy Loading)**: - Hibernate通过延迟加载策略,只在实际访问数据时才...

    《精通Hibernate》电子版(孙卫琴)

    Hibernate是一款开源的Object-Relational Mapping(ORM)框架,它为Java开发者提供了强大的数据持久化解决方案,将复杂的数据库操作转化为对Java对象的操作,简化了数据库应用的开发。Hibernate通过映射XML文件或...

    hibernate-3.2框架

    Hibernate 3.2框架是Java...总的来说,Hibernate 3.2框架为Java开发者提供了一个强大的ORM解决方案,简化了数据库操作,提升了开发效率。通过深入理解和熟练应用,开发者可以构建出更加健壮、高效的数据库驱动应用。

    hibernate_api_3.5.5GA

    综上所述,Hibernate API 3.5.5GA版本是一个功能强大且成熟的ORM解决方案,它的API设计充分考虑了开发者的便利性和系统的稳定性。通过深入理解和熟练掌握这个版本的API,开发者可以更高效地进行数据库操作,提升项目...

    Hibernate学习笔记

    Hibernate作为Java领域中广泛使用的ORM解决方案,它极大地简化了数据库操作,将复杂的SQL语句与Java代码解耦,提高了开发效率和代码可维护性。 这篇学习笔记涵盖了以下核心知识点: 1. **Hibernate概述**:介绍...

    Hibernate

    ### Hibernate核心知识点解析 ...综上所述,Hibernate不仅是一种强大的ORM工具,还是一个完整的持久层解决方案。通过掌握其核心概念和使用技巧,开发者可以极大地提高开发效率并简化复杂的数据库操作。

    Struts,Spring,Hibernate面试题[文].pdf

    Spring可以与Struts和Hibernate集成,形成更强大的MVC解决方案。 综上所述,理解和熟练掌握Struts、Spring和Hibernate的原理、工作流程及优化策略,对于Java Web开发者来说是至关重要的,这能帮助他们构建高效、可...

    最新Java面试宝典pdf版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    Java面试宝典-经典

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    java面试题大全(2012版)

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    Java面试宝典2012版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中...

    java面试宝典2012

    12、写Hibernate的一对多和多对一双向关联的orm配置? 134 9、hibernate的inverse属性的作用? 134 13、在DAO中如何体现DAO设计模式? 134 14、spring+Hibernate中委托方案怎么配置? 134 15、spring+Hibernate中委托...

    Java面试宝典2012新版

    12、写Hibernate的一对多和多对一双向关联的orm配置? 122 9、hibernate的inverse属性的作用? 122 13、在DAO中如何体现DAO设计模式? 123 14、spring+Hibernate中委托方案怎么配置? 123 15、spring+Hibernate中委托...

    java面试问题汇总(非常全面)

    hibernate持久化托管bean可否用bean与数据库相同的主键object关联 可以,通过设置主键映射实现。 #### 39. 如何在hibernate中调用原始sql 使用 `Session` 的 `createSQLQuery()` 方法。 #### 40. 分别描述JDBC...

    黑马面试宝典知识点复习

    - **大数据量访问解决方案**:缓存策略、分库分表、读写分离等。 - **遇到的问题及解决办法**:技术难题、团队合作、时间管理等方面。 - **项目收获**:个人成长、团队协作经验等。 - **构建工具与模块划分**:构建...

Global site tag (gtag.js) - Google Analytics