Кэш второго уровня не кэширует отфильтрованные коллекции в NHibernate? - PullRequest
3 голосов
/ 03 июня 2011

Я настраиваю кэш 2-го уровня с помощью NHibernate 3.0. Кэш 2-го уровня прекрасно работает для сущностей и коллекций, но у меня также есть некоторые сущности, которые имеют отфильтрованные коллекции .

 <bag name="EntityTrans" cascade="all-delete-orphan" table="EntityTrans">
            <key column="entityId" not-null="true" />
            <one-to-many class="MyDomain.EntityTran, MyDomain" />
            <filter name="cultureFilter" condition=":cultureCode = CultureCode" />
        </bag>

NHibernate 2-го уровня кэширования не кэширует вышеупомянутую фильтрованную коллекцию . Я вижу в NHProf, что для отфильтрованных запросов коллекции отправляются в базу данных. В моем конфигурационном файле NHibernate есть следующие записи.

<class-cache class="MyDomain.EntityTran, MuDomain" region="MyRegion" usage="read-only"/>
<collection-cache collection="MyDomain.Entity.EntityTrans" region="MyRegion" usage="read-only"/>

Нужно ли добавить что-то еще для кэширования отфильтрованной коллекции?

1 Ответ

8 голосов
/ 15 июня 2011

В настоящее время NHibernate не поддерживает кэш второго уровня для отфильтрованных коллекций.

Сначала я нашел это сообщение на форуме .Затем я просмотрел код ( CollectionLoadContext.cs ~ строка 299 ) и обнаружил следующее:

if (!(session.EnabledFilters.Count == 0) && persister.IsAffectedByEnabledFilters(session))
{
    // some filters affecting the collection are enabled on the session, so do not do the put into the cache.
    log.Debug("Refusing to add to cache due to enabled filters");
    // todo : add the notion of enabled filters to the CacheKey to differentiate filtered collections from non-filtered;
    //      but CacheKey is currently used for both collections and entities; would ideally need to define two separate ones;
    //      currently this works in conjunction with the check on
    //      DefaultInitializeCollectionEventHandler.initializeCollectionFromCache() (which makes sure to not read from
    //      cache with enabled filters).
    return; // EARLY EXIT!!!!!
}
...