2012-08-23 55 views
1

This blog post(引用爲here)表示SQLQuery不使用Hibernate會話緩存。但是,a)沒有證據,b)它們不使用SQLQuery.addEntity,它可能會提供允許Hibernate使用其緩存的信息。Hibernate中的SQLQuery使用會話緩存嗎?

The docs不提及這種或那種緩存。

如果我使用addEntity,SQLQuery是否使用會話緩存?

編輯This section的文檔的說:

每當你傳遞一個對象來保存(),更新()或者saveOrUpdate(),和 何時你使用load() get(),list(),iterate() 或scroll(),該對象被添加到 會話的內部緩存中。

由於addEntity()允許list()返回對象,這意味着它正在使用緩存。我該如何檢查?這些相同的文檔說,緩存有一個「包含」方法,可以瀏覽第二級緩存,但不能瀏覽會話緩存。

編輯#2:通過打開Hibernate查詢的日誌記錄,它似乎不是緩存,但也許某些情況下會使它緩存。

回答

0

根據的Javadoc SQLQuery,它擴展了Query接口,它提供了setCacheable方法(默認爲false),所以你應該能夠做到以下幾點:

Query query = session.createSQLQuery(
    "select * from my_table e") 
    .addEntity(MyEntityClass.class) 
    .setCacheable(true); 

此外,您可能希望通過使用 setCacheModesetCacheRegion方法來研究設置緩存區域。

1

我不認爲beny23的回答是正確的。我認爲setCacheable指的是二級緩存而不是會話緩存。

要檢查實體是否在會話緩存中,您可以使用Session.contains()。你也可以做一個快速測試:獲取實體,修改它,關閉會話,看看mod是否在數據庫中。