Поиск в спящем режиме по первичному ключу в списке напрямую в кэш-память второго уровня - PullRequest
1 голос
/ 14 октября 2011

У меня есть сущность с простым длинным первичным ключом. Я делаю запрос, как: выберите из таблицы, где primary_key IN (....);

Hibernate, похоже, хочет выполнить запрос, чтобы получить идентификаторы (которые я только что указал!), А затем перейти в кэш L2. Есть ли способ пропустить начальный запрос? Я просто хочу набор сущностей по первичному ключу. Не уверен, что это JPA 1 против JPA 2.0 (который лучше поддерживает списки).

Я могу сделать findById () в цикле и получить желаемый результат, но это, очевидно, не оптимально.

1 Ответ

0 голосов
/ 15 октября 2011

Вам нужно будет включить кеширование запросов и этот конкретный запрос как кеширующий. Это доступно только в JPA 2.0 через подсказки.

query.setHint(“org.hibernate.cacheable”, true);

И включите кэш запросов, установив следующее свойство

hibernate.cache.use_query_cache true

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

public List<T> findMany(Class<T> entityClass,List<? extends Serializable> ids) {
  List<T> result = new ArrayList<T>;
  for(Serializable id:ids) {
     result.add(entityManager.getRefrence(id));
  }

  for(T entity:result) {
    // force initialization of proxies, if batch loading is enabled
    // this shouldn't lead to one query per entity
    Hibernate.initialize(entity); 
  }
  return result;      
} 

Для этого может потребоваться несколько настроек - еще не проверял - особенно в части обобщения.

...