2010-11-22 62 views
13

hibernate是否保留LinkedHashSet的順序,如果是這樣,怎麼辦?如果這取決於數據庫的類型,我想知道這個PostgreSQL。hibernate是否保留LinkedHashSet的順序,如果是這樣,怎麼辦?

背景:

我知道LinkedHashSet是什麼,而我問這個的原因是因爲我記錄的一些功能我執行的「LOGERROR」表中,有一個名字一些'functionName'表的多對多關係。 我需要這些函數保持與執行它們時的順序相同,因此我首先找到相應的'functionName'對象,將它們放入LinkedHashSet(在失敗的每個函數之後),然後堅持'logError'對象。

現在,當我從數據庫中獲取的「LOGERROR」對象再次,將它仍然訂貨?如果是這樣,我很好奇Hibernate如何做到這一點。

+1

您是否嘗試使用@OrderColumn註釋? (也許這是一個JPA註釋) – willcodejavaforfood 2010-11-22 09:36:34

回答

13

第一:我認爲你說的是​​兩個實體之間的關係。類似於

@Entity 
public class A { 
@ManyToMany 
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "A_fk") }, inverseJoinColumns = { @JoinColumn(name = "B_fk") }) 
    private Set<B> bSet = new LinkedHashSet<B>(); 
} 

Hibernate並不保留訂單本身!

如果在實體A從數據庫加載看看使用的類,然後SetbSetPersistentSet類型,這是周圍其他Set包裝的,這是(對我來說)正常HashSet。 (HashSet不保留其元素的順序。)

即使使用休眠或ListLinkedHashSet,它仍然是不可取的基礎自然(非保證)數據庫順序執行。對於MySQL來說,它是某種反模式。

但是,您可以使用@Sort註釋(org.hibernate.annotations.Sort)使您的排序明確。例如:

@OneToMany(mappedBy = "as") 
@Sort(type = SortType.COMPARATOR, comparator = MyBComparator.class); 
public SortedSet<C> cs; 

@see:Ordering return of Child objects in JPA query


添加人盧卡斯Rzeszotarski於2012年9月1日:

但我們必須記住,使用@Sort註釋導致分揀對象內存(jvm),而不是在SQL中。相反,我們可以使用@OrderBy註釋來導致sql服務器端的排序。這兩個註釋在我的(ŁukaszRzeszotarski)意見中有一個缺點,即默認設置了排序。我(ŁukaszRzeszotarski)寧願hibernate使用自己的LinkedHashSet實現,當它'看到'使用order by子句時。

@see:Hibernate ordering in sql

+3

@ŁukaszRzeszotarski:如果你以這種方式再次編輯someone的帖子,那麼至少要清楚這是你的陳述,而不是原作者之一! – Ralph 2012-09-01 08:43:50

+0

這是愚蠢的答案,如果你真的有正常的地圖,而不是實體關係,你只是想通過'LinkedHashMap'保存順序 – Enerccio 2016-09-12 05:13:33

+0

@Enerccio:問題是關於hibernate如何存儲(或不)一個LinkedHashSet的順序,它是而不是關於你想要他們存儲地圖。如果你認爲我的答案是錯誤的(也許是錯誤的),那麼請寫一個更好的正確答案,我將刪除我的答案並且提高你的答案。 – Ralph 2016-09-12 15:46:45

0

集也具有內在的「秩序」,也不數據庫表 - 當你查詢的數據,你可以申請一個訂單,但除非你保留這個順序(例如,通過讓行逐一將它們放入一個有序容器就像一個鏈表),那麼返回的數據也將是無序的。

+1

LinkedHashSet有插入順序 – willcodejavaforfood 2010-11-22 10:25:36

0

當我需要堅持的項目列表的順序,我用一個Map而不是List

@OneToMany(fetch = FetchType.EAGER, mappedBy = "rule", cascade = CascadeType.ALL) 
@MapKey(name = "position") 
private Map<Integer, RuleAction> actions    = LazyMap.decorate(new LinkedHashMap<>(), FactoryUtils.instantiateFactory(RuleAction.class, new Class[] { Rule.class }, new Object[] { this })); 

在該Java例子,positionRuleAction整數屬性這樣的順序被持久的方式。我想在C#這看起來很相似。

相關問題