2009-11-03 6 views
0

je le mappage suivantNHibernate requête nommée et 2ème niveau cache

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="Domain.Core" 
       namespace="Domain.Core"> 
<class name="Industry" table="INDUSTRY"> 
<cache usage="read-write" region="IndustryCache" include="all"/> 
<id name="Id" type="Int64" column="IID"> 
    <generator class="sequence"> 
    <param name="sequence">INDUSTRY_SEQ</param> 
    </generator> 
</id> 
<version name="Version" column="VERSION" access="property" unsaved-value="null" generated="never"/> 
<property name="CreationTime" column="CREATE_DATE" type="DateTime" not-null="true" /> 
<property name="CreatedBy" column="CREATE_USER" type="String" not-null="true" /> 
<property name="LastUpdateTime" column="MODIFY_DATE" type="DateTime" not-null="false" /> 
<property name="LastUpdateBy" column="MODIFY_USER" type="String" not-null="false" /> 
<property name="Code" column="INDUSTRY" type="String" not-null="false" /> 
<map name="Resources" table="INDUSTRY_TL" fetch="subselect"> 
    <cache region="IndustryCache" usage="read-write" include="all"/> 
    <key column="INDUSTRY_ID"/> 
    <composite-index class="Framework.Globalization.UILanguage, Framework"> 
    <key-property name="Code" column="LANG" access="property" /> 
    </composite-index> 
    <composite-element class="Industry+Translation"> 
    <property name="Name" column="Industry_TL" /> 
    </composite-element> 
</map> 
</class> 
<query name="GetIndustyOrderByName"> 
<![CDATA[ 
from Industry as i left join fetch i.Resources as res where INDEX(res) = :lang order 
by res.Name 
]]> 
</query>  
</hibernate-mapping> 

et la configuration suivante dans hibernate.cfg.xml

<property name="show_sql">true</property> 
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> 
<property name='prepare_sql'>true</property> 
<property name='query.substitutions'>Y=true,N=false,0=false,1=true</property> 
<property name="generate_statistics">true</property> 
<property name="cache.use_second_level_cache">true</property> 
<property name="cache.provider_class">Framework.Cache.SossCacheProvider, Framework.Cache.SossNHibernateCache</property> 
<property name="cache.use_query_cache">true</property> 

Maintenant, quand je lance la requête avec le nom SetCacheable (true) qui appelle la collection mappée, elle ne parvient pas au cache de second niveau. Y a-t-il une raison pour laquelle?

Plus Générallement, existe-t-il un moyen de placer le jeu de résultats d'une requête nommée dans le cache de second niveau?

Merci!

Répondre

2

Pour les requêtes d'utiliser le cache de second niveau, deux choses doivent être faites:
1. Activer le cache de requête dans la configuration NHibernate:

<property name="cache.use_query_cache">true</property> 

2. Activez la requête pour la mise en cache lors de l'obtention l'instance IQuery:

IQuery = session.GetNamedQuery("from Industry as i left join fetch i.Resources as res where INDEX(res) = :lang order by res.Name") 
     .SetCacheable(true) 
     .Setxxx(); 

Ces paramètres provoquent les résultats des requêtes à mettre dans le cache de second niveau. Mais le cache de requête de second niveau ne stocke que les identifiants d'entités, pas les entités elles-mêmes. Pour que l'exécution de la requête évite complètement la base de données, les entités doivent également être mises en cache. Voir le NH Docs pour plus d'explications sur l'interaction des caches de second niveau.

+0

J'ai tout ce qui est en place et NHProf me dit que je ne suis pas en train d'atteindre le niveau 2 du cache. La seule différence est que le nom mis en cache est défini dans le fichier hbml.xml par rapport au code. – Herman

+0

Je pense que plus de détails sont nécessaires. Le mappage complet de la classe Industry et du fichier de configuration NH serait un bon début. –

+0

Plus d'informations dans l'org. question – Herman

Questions connexes