程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Hibernate中雙向關聯加載排序的解決方案

Hibernate中雙向關聯加載排序的解決方案

編輯:關於JAVA

問題: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>

感覺第二個方法是按照我為角色配置菜單的順序排序的,靈活性比較差,所以個人認為還是第一個方法比較好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved