2015-11-06 98 views
-1

我使用帶hibernate 4的jpa 2將對象保存/更新到數據庫。要查看這些對象,使用jsf 2的網頁,這一切都很好。jpa在更新後保存數據庫中的順序

我有以下問題:當我更新任何對象時,數據庫(postgres)會將更新的對象放在數據庫的最後一行。我想知道爲什麼會發生這種情況?不能數據庫(或它是jpa或休眠?)只是更新行並將其保留在它的位置?該ID當然從未改變。

INSERT INTO sector (id, code) VALUES(1, 'PRIVAAT'); 
INSERT INTO sector (id, code) VALUES(2, 'PUBLIEK'); 

Select * from sector; 

返回在每一個程序,用於查詢數據庫:

1 privaat

2 publiek

現在我更新的第一行:現在

update sector set code = 'privaat' where id = 1; 

它返回在每一個程序:

2 publiek

1 privaat

使用我們的應用程序,又使用POSTGRES作爲DB時,這也是這種情況。

然而,在我們的迴歸測試,它使用內存數據庫HSQLDB,它總是返回:

1 privaat

2 publiek

迴歸測試顯然是我們從數據庫,沒想到這個行爲之前沒有其他數據庫。

問題是,在網絡中我們想要保留訂單,以便用戶不必搜索數據:它總是一個固定的位置。特別是當爲用戶處理大量參考數據時,這非常煩人。測試證實了這一點,但應用程序(使用不同的數據庫)的工作方式不同。

我們現在唯一的解決方案是將條款放在任何位置,但我們希望有一個乾淨的方式來保存訂單。到處使用順序也有一個小的性能打...

所以我的問題是,這是由於具體的數據庫如何工作(供應商依賴)?或者這是由於JPA根據方言以不同的方式映射查詢?如果這是第二種情況,是否有一個屬性可以保留JPA(或者也許是休眠)的順序?

+1

定義「最後一行」。它用UPDATE語句更新DB行。您的查詢是將數據拉回來的,並且該查詢可以像您所說的那樣使用ORDER BY子句,因此如果需要某種排序,請使用ORDER BY。這就是你應該保證訂購 –

+0

我會用一個例子來解釋。我插入兩行第一行id = 1和第二行id = 2。當我做選擇所有它總是返回(在我使用的任何程序)兩行id = 1的第一行和id = 2的第二行。我通過JPA更新id = 1的行的列。現在,當我做選擇所有它總是返回兩行id = 2的第一行和id = 1的第二行...神祕:) –

+0

沒有我的意思是如果我做一個查詢後更新訂單更改。只有在更新後訂單纔會更改。 –

回答

2

那裏沒有訂單。你只是得到了從堆中讀取的行的半隨機順序。

如果您想要訂購,請使用ORDER BY

某些數據庫實現具有自然排序,因爲數據是如何構造的(比如說,作爲b-tree表)。 PostgreSQL使用堆,所以沒有訂單,除非你要求一個。

+0

查找發現Oracle和HSQLDB使用b-tree和postgres後: (必須在任何地方使用orderby ... tnx –

+0

@FabiYo:Postgres也使用b-tree作爲索引 - 就像Oracle和HSQLDB一樣,Oracle也不會以任何特定順序返回行 –

+1

這取決於主要依賴於它自己的表是以B樹還是堆的形式存儲的,「聚簇索引」,「索引組織表」等往往具有自然排序,即使存在索引,堆也不會。 –