Hibernate: el caché de almacenamiento en caché de consultas/segundo nivel no funciona por valor de objeto que contiene subitems

StackOverflow https://stackoverflow.com/questions/2201457

Pregunta

He estado luchando con el siguiente problema:
Tengo un objeto de valor que contiene diferentes paneles. Cada panel tiene una lista de campos.

Cartografía:

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

Utilizo los siguientes criterios para obtener el objeto de 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 veo, el caché de consulta contiene solo la selección principal como

select * from CTRY where ctry_cd_id=?

Tanto los racuntrypanels como Rafieldvo están en caché de segundo nivel. Si verifico el contenido de caché de segundo nivel, puedo ver que cointainea las rafields y los racuntrypanels también y puedo ver la selección ... de Ctry donde ctry_cd_id = ... en la región de caché de consultas también.

Cuando llamo al servlet, parece que está usando el caché, pero la segunda vez no. Si verifico el contenido del caché usando JMX, todo parece estar bien, pero cuando mido el tiempo de acceso del objeto, parece que no siempre usa el caché.

Saludos Zoltan

¿Fue útil?

Solución

Creo que también debes almacenar en caché la asociación:

<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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top