Hibernate EntityManager + Query Cache - выборка присоединения не работает

Я пытаюсь кэшировать такой запрос:

TypedQuery<Foo> q = em.createQuery(
    "SELECT foo FROM Foo foo " +
    "INNER JOIN FETCH Foo.bar "
);
q.setHint("org.hibernate.cacheable", true);

Проблема в том, что FETCH, похоже, не имеет никакого эффекта при попадании в кеш, т.е. коллекция Foo.bar не инициализируется. Я мог бы перебрать список результатов и инициализировать все экземпляры коллекции вручную, но это сделало бы все это еще медленнее, чем без использования кеша запросов в первую очередь.

Я использую JBoss AS 6.0 / Hibernate 3.6 с Infinispan в качестве механизма кэширования.

Любопытно, что согласно статистике кеша, которую я получаю через консоль JMX, объекты в Foo.bar, кажется, кэшируются, но кеш для этих объектов не получает никаких попаданий.


person chris    schedule 28.04.2011    source источник


Ответы (1)


Это можно исправить, применив @Cache к свойству коллекции (конечно, целевой объект тоже должен кэшироваться), см. 21.2.1. Сопоставления кеша.

person axtavt    schedule 28.04.2011
comment
Спасибо, кажется, мне все еще нужно перебрать список результатов и инициализировать коллекции, хотя они теперь загружаются из кеша, а не из базы данных. На самом деле не решает мою проблему, потому что в моем реальном приложении у меня есть относительно сложный граф объектов, который я должен частично извлечь, и перебирать все коллекции, некоторые из которых сами имеют зависимости, которые мне также нужно получить, ест убрать любые преимущества производительности, которые я мог бы получить от кэширования. - person chris; 28.04.2011
comment
@chris: может быть, вам стоит попробовать посмотреть, может ли EntityGraph соответствовать вашим потребностям. - person willome; 29.08.2016