2013-04-07 61 views
1

我正在使用hibernate來運行命名的JPA查詢。爲什麼hibernate會從同一個會話的同一個查詢中返回不同的對象?

該查詢從同一會話執行兩次,查詢應返回相同的行,因爲數據庫在此期間不會更改。

令我驚訝的是,查詢返回的對象與這兩個查詢結果列表(數據相同但對象不同)不同。啓用第一級緩存(默認情況下)後,我認爲第二個查詢應該返回與第一個查詢相同的對象?

查詢是一個簡單的命名查詢:

SELECT e from TABLE e where e.name=?1 

是緩存隨查詢莫名其妙地繞過?或者我對第一級緩存的理解是錯誤的?

+0

您可以添加您用於查詢的代碼嗎?你的對象是否有實體鍵? – 2013-04-07 23:35:06

回答

2

這些結果很大程度上取決於您是否爲您的對象提供實體標識。

還有會話緩存和查詢緩存在Hibernate中是兩個不同的東西。

如果您從同一會話中加載具有相同實體ID的對象,它將返回相同的對象。

但是,如果您使用查詢來加載對象 - 這是一個不同的故事。使用查詢緩存應該返回相同的數據,不管你有什麼實體ID。

默認情況下,查詢緩存未打開。您必須執行類似query.setCacheable(true);的操作才能確保查詢被緩存。或者在Hibernate配置文件中設置hibernate.cache.use_query_cache屬性。

+0

我並不完全遵循實體密鑰的意思嗎?是實體的@Id屬性? – Wudong 2013-04-07 23:45:50

+0

對不起,Id是我的意思 – 2013-04-08 00:33:19

相關問題