Bonjour, il y a un point que je ne comprends pas très bien dans hibernate au niveau du cache des requêtes :
J'ai une classe en relation ManyToMany avec trois autres classes, en gros Pays, Service et Composant et donc des collections que j'ai mis en mode Lazy. Quand je charge un pays avec une requête Criteria et un mode FetchMode.JOIN pour les collections, enfin de faire un unique select en base, Hibernate ne met en cache que le pays, et pas les collections. Par contre, quand j'enlève le mode Lazy, Hibernate met bien le pays et les collections en cache.
Code:
public class Pays implements Serializable{
private static final long serialVersionUID = -8767337896773261244L;
/**
* the id of the country
*/
private long id;
/**
* name of the country
*/
private String nom;
/**
* The region of the country
*/
private Region region;
/**
* Relations between a country and a composant
*/
private Set<PaysComposants> pc = new HashSet<PaysComposants>(0);
/**
* Relations between a country and a service
*/
private Set<PaysServices> ps = new HashSet<PaysServices>(0);
/**
* Relations between a country and some keys figures
*/
private Set<KeyFigure> kf = new HashSet<KeyFigure>(0);
J'ai mis en place une couche DAO et une couche de service qui accède à ce DAO
Code:
@Override
public Pays read(String nomPays) {
Criteria criteria = super.getSession().createCriteria(Pays.class);
criteria.setFetchMode("pc", FetchMode.JOIN);
criteria.setFetchMode("ps", FetchMode.JOIN);
criteria.setFetchMode("kf", FetchMode.JOIN);
criteria.add(Restrictions.eq("nom", nomPays));
criteria.setCacheable(true);
Pays p=(Pays) criteria.uniqueResult();
return p; }
Comme vous pouvez le voir, j'ai bien mis la requête en cache, et sur chaque classe et chaque collection aussi, j'ai mis cette annotation
Code:
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
.
Voici mon fichier de cache
Code:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
monitoring="autodetect" dynamicConfig="true">
<defaultCache maxElementsInMemory="100000" eternal="false"
timeToIdleSeconds="3600" timeToLiveSeconds="3600" overflowToDisk="true" />
<cache name="org.hibernate.cache.internal.StandardQueryCache"
maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="3600"
timeToLiveSeconds="3600">
</cache>
<cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
maxElementsInMemory="10000" eternal="true">
</cache>
et mon fichier des propriétés hibernate où j'ai activé le cache de second niveau et le cache des requêtes :
Code:
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="current_session_context_class">thread</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_structured_entries">true</prop>
<prop key="hibernate.cache.generate_statistics">true</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
<prop key="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">
applicationContext-ehCache-entity.xml
</prop>
</props>
</property>
Merci de m'aider