Pergunta

Eu tenho lutado com o seguinte problema:
Eu tenho um objeto de valor contendo painéis diferentes. Cada painel possui uma lista de campos.

Mapeamento:

<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>

Eu uso os seguintes critérios para obter o objeto Valor:

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

Como vejo o cache de consulta contém apenas a seleção principal como

select * from CTRY where ctry_cd_id=?

Tanto o RacountryPanels quanto o Rafieldvo estão em cache de segundo nível. Se eu verificar o teor de cache do 2º nível, posso ver que ele cointilia os Rafields e os RacountryPanels também e posso ver a seleção. Da ctry onde também ctry_cd_id = ... na região do cache de consulta.

Quando chamo o servlet, parece que ele está usando o cache, mas a segunda vez não. Se eu verificar o conteúdo do cache usando o JMX, tudo parece estar ok, mas quando medro o tempo de acesso ao objeto, parece que ele nem sempre usa o cache.

Saúde Zoltan

Foi útil?

Solução

Eu acho que você também precisa armazenar em cache a associação:

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top