Hibernate雙向關聯中常常用Set 而不用List

對於一對多關聯當中的List,需要在數據庫裏面維護一個index列,如果List當中的某個元素被刪除,那麼Hibernate會連續發送多條 update語句,更新後續所有元素的index列,以確保index的連續性(在inverse爲false的情況下),如果你選擇自己維護index 列,也同樣會面臨這個問題,甚至更棘手(在inverse爲true的情況下),所以List被謹慎的使用在極其罕見的場合。

 

一般來說,我(Robbin)會選擇在1對關聯當中使用Bag,在多對多關聯當中使用Set

不要誤會了robbin所說的話,他所說的要特別慎用list是指的hibernate映射文件中的list類型,而不是實體類中的List類型。映射文件中用Bag類型,在實體類中是可以對應List的。

至於說排序,List(Bag映射)和Set都是可以排序的,hibernate有自己的SetList、Map實現,其內部根據使用的排序方式使用java.util中的各種不排序的或排序的集合實現類。

Set映射有兩種排序方式,一是使用映射文件中的sort屬性,一般需要自己實現一個java.util.Comparator,sort屬性指定 自己實現的比較類,hibernate返回給客戶的實際是Set的TreeSet實現,將該比較類作爲treeSet的比較器,這種排序是在內存中進行的,可以在比較器中按實體類的某個字段排序或實現更復雜的排序方法,非常靈活,但是要自己實現比較器,麻煩一些。

另一種方法是使用映射中的order-by屬性,可以指定表中的一個排序字段,排序是在數據庫中進行的,hibernate返回是LinkedHashSet實現,可以保持對象的前後次序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章