我使用帶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(或者也許是休眠)的順序?
定義「最後一行」。它用UPDATE語句更新DB行。您的查詢是將數據拉回來的,並且該查詢可以像您所說的那樣使用ORDER BY子句,因此如果需要某種排序,請使用ORDER BY。這就是你應該保證訂購 –
我會用一個例子來解釋。我插入兩行第一行id = 1和第二行id = 2。當我做選擇所有它總是返回(在我使用的任何程序)兩行id = 1的第一行和id = 2的第二行。我通過JPA更新id = 1的行的列。現在,當我做選擇所有它總是返回兩行id = 2的第一行和id = 1的第二行...神祕:) –
沒有我的意思是如果我做一個查詢後更新訂單更改。只有在更新後訂單纔會更改。 –