Я боролся со следующей проблемой:
У меня есть объект значения, содержащий разные панели. Каждая панель имеет список полей.
Отображение:
<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 кэшируются на втором уровне.
Если я проверяю содержимое кэша 2-го уровня, я вижу, что оно также объединяет поля RAFields и RACountryPanels, и я вижу выбор .. из CTRY, где ctry_cd_id = ... также в области кэша запросов.
Когда я вызываю сервлет, кажется, что он использует кеш, но второй раз нет.
Если я проверяю содержимое кеша с помощью JMX, все кажется нормальным, но когда я измеряю время доступа к объекту, кажется, что он не всегда использует кеш.
Приветствие
Золтан