Hibernate - Cache de requête / Cache de deuxième niveau ne fonctionne pas par valeur d'objet contenant des sous-éléments
-
18-09-2019 - |
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
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>