问题:Hibernate的<many-to-many>双向关联中, 一方加载另一方时,怎么样达到按自定义规则排序的目的呢?
实例:角色和菜单是多对多的关系,为角色分配菜单后,加载菜单时,我需要按 照菜单的ID来排序显示。
解决办法:
1. 通过在hbm配置文件中配置解决,需要自定义比较器。
1) 在多对多的主控端指定sort 属 性
这里的主控端为role,受控端为menu。
role的配置为:
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
menu 的配置为:
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
2) 自定义MenuComparator 这里需要实现Comparator接口,自定义比较器
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
我在这里是以菜单的ID为排序关键字的,也可通过其他的诸如时间等进行排序,相当灵活,且代码量不大。
2. 使用idbag为关系表增加一个主键。
<idbag >可以理解为 人工的id生成器,就好像是实体类一样!集合的每一行都有一 个不同的人造关键字。但是,Hibernate没有提供任何机制来让你取得某个特定行的人造关键字。 注意
< 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 >
感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个 方法比较好。
<idbag >
的更新性能要比普通的<bag>
高 得多!Hibernate可以有效的定位到不同的行,分别进行更新或删除工作,就如同处理一个list, map或者set一样。![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![点击在新窗口查看原始图片](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
感觉第二个方法是按照我为角色配置菜单的顺序排序的,灵活性比较差,所以个人认为还是第一个 方法比较好。