Hibernate - Cache de requête / Cache de deuxième niveau ne fonctionne pas par valeur d'objet contenant des sous-éléments

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

Question

J'ai eu du mal avec le problème suivant:
J'ai un objet de valeur contenant différents panneaux. Chaque panneau a une liste de champs.

Mappage:

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

J'utilise les critères suivants pour obtenir l'objet de valeur:

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

Comme je le vois, le cache de requête ne contient que la sélection principale comme

select * from CTRY where ctry_cd_id=?

Racountrypanels et Rafieldvo sont mis en cache de deuxième niveau. Si je vérifie le contenu de cache du 2e niveau, je peux voir qu'il est également enroche les rafields et les racountrypanels et je peux également voir le SELECT .. dans Ctry Where CTry_CD_ID = ... dans la région de cache de requête également.

Quand j'appelle le servlet, il semble qu'il utilise le cache, mais la deuxième fois pas. Si je vérifie le contenu du cache à l'aide de JMX, tout semble être OK, mais lorsque je mesure l'heure d'accès à l'objet, il semble qu'il n'utilise pas toujours le cache.

Cheers Zoltan

Était-ce utile?

La solution

Je pense que vous devez également mettre en cache l'association:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top