JPA Hibernate EHCACHE проблема с однозначными ассоциациями - QueryCache - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть объект, напрямую сопоставленный с пользовательским интерфейсом, в котором есть несколько таблиц поиска, в которых данные не изменились бы вообще.В моем контроллере я использую findAll в таблицах поиска, чтобы получить все значения и установить его для модели.

Основной объект

@Entity
public class MainEntity implements Serializable {
    @OneToOne(cascade = CascadeType.ALL, optional=true)
    @JoinColumn(name="lookup_entity_key")
    private LookupEntity luentity;
}

Элемент поиска:

@Entity
@Table(name="lookup_entity")
@Cacheable
public class LookupEntity implements Serializable {

}

Я включил кэш второго уровня в файле persistence.xml.конфигурация ниже

<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory" />
<property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE" />

FindALL Query Cache:

entityManager.createQuery("from " + this.entityClass.getName() )
                .setHint("org.hibernate.cacheable", true)
                .getResultList();

Когда запрос поступает из пользовательского интерфейса, он пытается вызвать методы findAll в объекте LookupEntity.По какой-то причине первый запрос правильно вызывает findAll sql, но последующий запрос вызывает SQL-запрос findById для всех строк, присутствующих в LookupEntity.Это ожидаемое поведение или что-то не так с моей конфигурацией.

Пожалуйста, помогите !!!

Спасибо!

1 Ответ

1 голос
/ 23 февраля 2011

Ожидаемое поведение: кеш запросов будет возвращать идентификаторы сущности, а Hibernate загрузит сами сущности.Таким образом, объекты, запрашиваемые с помощью кэшированного запроса, должны находиться в кэше объектов второго уровня, чтобы операция была полезной.

Это в документации :

Примечание

Кэш запросов не кэширует состояние реальных объектов в кэше;он кэширует только значения идентификатора и результаты типа значения.По этой причине кэш запросов всегда должен использоваться вместе с кешем второго уровня для тех объектов, которые, как ожидается, будут кэшироваться как часть кеша результатов запроса (так же, как при кэшировании коллекции).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...