В моем приложении используются JPA (1.2), Spring (3.1.2), Spring данные (1.1.0) и спящий режим (4.1.7). База данных: Oracle10g
Мы обеспечиваем кэширование второго уровня. Он отлично работает с сущностью, но создает проблемы для кэширования именованных запросов.
Проблема в том, что если именованный запрос имеет такое же предложение where, но другое выражение select, то независимо от того, что первый запрос выполняет его, он дает тот же результат для второго запроса.
Как и мой первый запрос (countRelease),
select count(r) from Release r where r.type in
(select c.contentTypeId from ContentType c where c.parentContentTypeId is NULL)
order by r.validityStart
а второй запрос (findRelease) -
select r from Release r where r.type in
(select c.contentTypeId from ContentType c where c.parentContentTypeId is NULL)
order by r.validityStart
Если первый запрос запускается первым, тогда будет отсчет, и после этого, если я запустил второй запрос, тогда также будет подсчитано, что он должен предоставить мне список объектов выпуска.
Если я удаляю кеш запросов, он работает нормально, и если я сделаю некоторые изменения во втором запросе, где предложение, то и он работает нормально, но мне не нужно это делать.
Как мы можем решить эту проблему?
Мой код Java
@Query(name="findRelease")
@QueryHints({@QueryHint(name = "org.hibernate.cacheRegion", value ="cvodrelease"),@QueryHint(name = "org.hibernate.cacheable", value ="true") })
public List<Release> findRelease();
@Query(name="countRelease")
@QueryHints({@QueryHint(name = "org.hibernate.cacheRegion", value ="cvodrelease"),@QueryHint(name = "org.hibernate.cacheable", value ="true") })
public Long countOfRelease(Date today);
Конфигурация кэша
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" />
<property name="hibernate.cache.provider_configuration_file_resource_path" value="ehcache.xml" />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cacheManager-ref="ehcache"/>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:configLocation="ehcache.xml" p:shared="true"/>