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

2021-05-27 11:55:07 字數 1475 閱讀 3991

關鍵字: hibernate中雙向關聯載入排序的解決方案

問題:hibernate的雙向關聯中,一方載入另一方時,怎麼樣達到按自定義規則排序的目的呢?

例項:角色和選單是多對多的關係,為角色分配選單後,載入選單時,我需要按照選單的id來排序顯示。

解決辦法:

1. 通過在hbm配置檔案中配置解決,需要自定義比較器。

1) 在多對多的主控端指定sort屬性

這裡的主控端為role,受控端為menu。

role的配置為:

menu的配置為:

2) 自定義menucomparator

這裡需要實現comparator介面,自定義比較器

/** *//**

* 選單排序比較器

* menucomparator

* @author allen

*/public class menucomparator implements comparator

if(o2 == null)

int cc = 0;

if (o1 instanceof menuinfovo && o2 instanceof menuinfovo)

return ((cc < 0) ? -1 : (cc > 0) ? 1 : 0);}}

我在這裡是以選單的id為排序關鍵字的,也可通過其他的諸如時間等進行排序,相當靈活,且**量不大。

2. 使用idbag為關係表增加乙個主鍵。

可以理解為人工的id生成器,就好像是實體類一樣!集合的每一行都有乙個不同的人造關鍵字。但是,hibernate沒有提供任何機制來讓你取得某個特定行的人造關鍵字。注意

的更新效能要比普通的

高得多!hibernate可以有效的定位到不同的行,分別進行更新或刪除工作,就如同處理乙個list, map或者set一樣。

選單列表

主鍵

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

這是網上所提供的解決方案。

hibernate在處理一對多,多對一雙向關聯時,用order-by應該就可以解決問題。

在處理多對多時,用最上面的方法,當相等時就可能被覆蓋,這時就要有第二次比較。

public class entercomparator implements comparator 

if (o2 == null)

int cc = 0;

if (o1 instanceof entertainment && o2 instanceof entertainment)

}return ((cc < 0) ? 1 : (cc > 0) ? -1 : 0);

}}

hibernate雙向關聯轉化為Json資料

用jquery json開發過程遇到的dug 想了半天,才想到是hibernate的問題,hibernate產生了死迴圈查詢 跟hibernate的配置檔案有關 解決方案,在轉成json物件的時候過濾掉bean中引起死迴圈查詢的屬性 一般為設定的外來鍵 轉換的時候呼叫過濾器 jsonconfig c...

Hibernate雙向多對多關聯

一 配置雙向多對多關聯 以project類 專案 和emp類 員工 為例 1 建立project類,並需要定義集合型別的emp屬性 public class project public void setpid integer pid public string getpname public vo...

Hibernate雙向多對多關聯

一 配置雙向多對多關聯 以project類 專案 和emp類 員工 為例 1 建立project類,並需要定義集合型別的emp屬性 public class project public void setpid integer pid public string getpname public vo...