Bonjour,
Je rencontre un petit problème avec ehache :
Soit le cas suivant : un produit est rattaché à des catégories et à des familles.
Dans le mapping de la classe produit
<many-to-one
name="category"
class="fr.as.galilei.model.impl.Category"
cascade="none"
update="true"
insert="true"
lazy="false"
fetch="select"
not-found="ignore"
column="ID_CATEGORY"
/>
<many-to-one
name="family"
class="fr.as.galilei.model.impl.Family"
cascade="none"
update="true"
insert="true"
lazy="false"
fetch="select"
not-found="ignore"
column="ID_FAMILY"
/>
Les classes category et family sont cachées et chargées par spring au démarrage de la webapp (une dizaine d'entités dans les deux cas).
<cache name="fr.as.galilei.model.impl.Category"
maxElementsInMemory="50"
eternal="true"
timeToIdleSeconds="86400"
timeToLiveSeconds="86400"
overflowToDisk="false"
/>
<cache name="fr.as.galilei.model.impl.Family"
maxElementsInMemory="50"
eternal="true"
timeToIdleSeconds="86400"
timeToLiveSeconds="86400"
overflowToDisk="false"
/>
Comme le chargement des deux association est à lazy=false, je peux interroger mes produits
* sans faire de jointure (inner join fetch ou left join fetch)
* en ramenant la catégorie et la familles de chaque produit sans pour autant faire de nouvelles requêtes puisque les entités de ces deux classes sont en cache.
Problème : tous les produits ne sont pas rattachés à des familles (ID_FAMILY de la table PRODUCT peut être nul dans la base), c'est la raison d'être du not-found="ignore" dans le mapping de l'association). Et lorsque j'itère sur un produit qui n'a pas de famille :
1. Ehcache voit que le produit est rattaché à une famille nulle, qu'il interprète en 0
2. EhCache cherche dans le cache la famille #0 mais ne la trouve pas
3. Il effectue une requête sur la table des famille en recherchant celle dont l'identifiant est 0
Et comme il ne la trouve pas il ne peut pas la mettre en cache et recommence à l'itération suivante si le produit suivant n'a pas de famille.
13:25:05,029 * DEBUG | hibernate.cache.EhCache:104 | key: fr.as.galilei.model.impl.Family#0
13:25:05,029 * DEBUG | ehcache.store.MemoryStore:204 | fr.as.galilei.model.impl.FamilyCache: MemoryStore miss for fr.as.galilei.model.impl.Family#0
13:25:05,029 * DEBUG | sf.ehcache.Cache:370 | fr.as.galilei.model.impl.Family cache - Miss
13:25:05,029 * DEBUG | hibernate.cache.EhCache:113 | Element for fr.as.galilei.model.impl.Family#0 is null
La ligne suivante dans le log : la requête dans la base pour rechercher la famille dont l'ID est 0 (et qui n'existe pas).
Avez vous une idée pour résoudre ce problème sans rajouter une ligne '0' dans la table des familles ?
Merci,
Gengis
|