JPA / HIBERNATE - индексируются ли экземпляры объектов только по id? - PullRequest
2 голосов
/ 25 октября 2010

Вероятно, это основной вопрос, но не смог найти ответ нигде в Интернете.

Я пытаюсь использовать кэш второго уровня (используя ehcache) и просто проверил, что некоторые объекты извлекались из базы данных каждый раз, когда я пытался их загрузить, единственное отличие заключалось в том, что я получал их не по id, а по свойство, которое имеет SEO-дружественное имя, которое используется для создания URL в системе, с которой я работаю. Способен ли jpa / hibernate извлекать объекты из кэша только с помощью идентификатора объекта obj? Есть ли способ заставить его работать без необходимости активировать кеш запросов?

1 Ответ

1 голос
/ 25 октября 2010

Может ли jpa / hibernate извлекать объекты из кэша просто с помощью идентификатора объекта obj?

Да, кэш второго уровня работает для запроса, который ищет один объект на основена Id, т.е. при использовании EntityManager.find() или EntityManager.getReference() (или эквивалентных Session#get() и Session#load() из Hibernate API).AFAIK, это относится ко всем реализациям JPA.

Есть ли способ заставить его работать без необходимости активировать кэш запросов?

При использовании стандартного JPA я не вижу другого выбора, кроме использования Query Cache.

Но если вы не возражаете против использования Hibernate API, может быть альтернатива с Query#iterate()Query#iterate() Hibernate выдаст SQL-запрос, который будет извлекать только идентификаторы, а при переборе результатов будет загружать соответствующие объекты из кэша.

Очевидно, Query#iterate() будет намного медленнее, чем Query#list(), если вы не используете кэш второго уровня.

Лично я бы использовал кэш запросов.

См. Также

...