2010-02-04 35 views
2

我一直在努力解決以下問題:
我有一個包含不同面板的值對象。每個面板都有一個字段列表。休眠 - 查詢緩存/二級緩存不能通過包含子項目的值對象

映射:

<class name="com.aviseurope.core.application.RACountryPanels" table="CTRY" schema="DBDEV1A" where="PEARL_CTRY='Y'" lazy="join"> 
<cache usage="read-only"/> 
<id name="ctryCode"> 
<column name="CTRY_CD_ID" sql-type="VARCHAR2(2)" not-null="true"/> 
</id> 
<bag name="panelPE" table="RA_COUNTRY_MAPPING" fetch="join" where="MANDATORY_FLAG!='N'"> 
<key column="COUNTRY_LOCATION_ID"/> 
<many-to-many class="com.aviseurope.core.application.RAFieldVO" column="RA_FIELD_MID" where="PANEL_ID='PE'"/> 
</bag> 
</class> 

我用以下標準來獲取值對象:

Session m_Session = HibernateUtil.currentSession(); 
      m_Criteria = m_Session.createCriteria(RACountryPanels.class); 
      m_Criteria.add(Expression.eq("ctryCode", p_Country)); 
      m_Criteria.setCacheable(true); 

當我看到查詢緩存只包含主要選擇像

select * from CTRY where ctry_cd_id=? 

RACountryPanels和RAFieldVO都是第二級緩存。 如果我檢查二級緩存內容,我可以看到它同時支持RAFields和RACountryPanels,並且我可以在CTRY中看到select ..,其中ctry_cd_id = ...也位於查詢緩存區域中。

當我調用servlet時,似乎它正在使用緩存,但第二次沒有。 如果我使用JMX檢查緩存的內容,一切似乎都可以,但是當我測量對象訪問時間時,似乎並不總是使用緩存。

乾杯 佐爾坦

回答

4

我認爲你還需要緩存的關聯:

<bag name="panelPE" table="RA_COUNTRY_MAPPING" fetch="join" where="MANDATORY_FLAG!='N'"> 

    <cache usage="read-write"/> 

    <key column="COUNTRY_LOCATION_ID"/> 
    <many-to-many class="com.aviseurope.core.application.RAFieldVO" column="RA_FIELD_MID" where="PANEL_ID='PE'"/> 
</bag> 
+0

我嘗試了,但沒有:-(幫助 – HamoriZ 2010-02-04 17:29:17

+0

@hamoriz嘗試,如果你能提供更多的細節(比如你在請求之前和之後用JMX看到的東西) – 2010-02-04 17:36:52

+0

RA_FIELD映射存在另一個問題,在修復它之後,你的建議解決了問題 – HamoriZ 2010-02-09 19:50:33