Hibernate中双向关联加载排序的解决方案
来源:互联网 发布:新手python推荐书籍 编辑:程序博客网 时间:2024/06/08 17:18
关键字: hibernate中双向关联加载排序的解决方案
问题:Hibernate的<many-to-many>双向关联中,一方加载另一方时,怎么样达到按自定义规则排序的目的呢?
实例:角色和菜单是多对多的关系,为角色分配菜单后,加载菜单时,我需要按照菜单的ID来排序显示。
解决办法:
1. 通过在hbm配置文件中配置解决,需要自定义比较器。
1) 在多对多的主控端指定sort属性
这里的主控端为role,受控端为menu。
role的配置为:
<set table="ROLE_MENU" inverse="false" lazy="false" sort="menu.MenuComparator"> <key column="RM_ROLE_ROLE_ID" /> <many-to-many column="RM_MENU_MENU_ID" /> </set>
menu的配置为:
<set table="ROLE_MENU"> <key column="RM_MENU_MENU_ID" /> <many-to-many column="RM_ROLE_ROLE_ID" /> </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 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" /> </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中双向关联加载排序的解决方案
- Hibernate的单向关联和双向关联
- Hibernate中双向一对多关联关系
- hibernate的实体类双向关联转json报错之死循环解决方案
- Hibernate OneToOne双向关联为什么没有外键的一方不能Lazy加载?
- hibernate中----一对多单向关联,一对多双向关联
- Hibernate中关联关系一对多(双向关联)
- 6.2.1 Hibernate的单、双向关联
- Hibernate的单、双向关联(一)
- Hibernate的单、双向关联(二)
- Hibernate -- 一对多的双向关联关系
- 【Hibernate】双向关联的oneTomany练习
- Hibernate的双向1-N关联(五)
- Hibernate的双向N-N关联(六)
- Hibernate的双向1-1关联(七)
- Hibernate 双向一对多表的关联
- Hibernate one2many 双向关联
- hibernate关联映射-双向
- 描边时消除锯齿SetSmoothingMode
- 实用且不花哨的js代码大全(二)
- ArrayList和数组间的相互转换
- 结合工具来实现敏捷开发 - 10
- 如何编译第一个模块hello
- Hibernate中双向关联加载排序的解决方案
- 一个程序员的十年程序人生感悟
- Ping Servers with PowerShell
- View编程(2): invalidate()再探
- "让你的软件飞起来"心得
- Hibernate性能优化
- hibernate二级缓存攻略
- asp.net c#后台页代码 如何使用confirm这样的函数,并获得其bool返回值?
- Setup Local SMTP Server(Windows 2003 server)