Hibernate - query nella cache cache / secondo livello non funziona per oggetto valori contenente sottoelementi

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

Domanda

Ho lottato con il seguente problema:
Ho un oggetto valore che contiene diversi pannelli. Ogni pannello ha un elenco di campi.

Mapping:

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

Io uso i seguenti criteri per ottenere l'oggetto valore:

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

Per come la vedo la cache delle query contiene solo il principale selezionare come

select * from CTRY where ctry_cd_id=?

Sia RACountryPanels e RAFieldVO sono secondi nella cache di livello. Se posso controllare il contenuto della cache 2 ° livello che posso vedere che contiene tutto il RAFields ei RACountryPanels come bene e posso vedere la scelta de .. da dove CTRY ctry_cd_id = ... nella regione di cache delle query pure.

Quando chiamo il servlet sembra che sta usando la cache, ma la seconda volta non. Se posso controllare il contenuto della cache usando JMX, tutto sembra essere ok, ma quando ho misurare il tempo di accesso agli oggetti, sembra che non utilizza sempre la cache.

Saluti Zoltan

È stato utile?

Soluzione

Credo che avete bisogno di memorizzare nella cache anche l'associazione:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top