JPA / Hibernate - это объекты экземпляры кэшированы индексированы только по ID?

StackOverflow https://stackoverflow.com/questions/4010986

Вопрос

Вероятно, это основной вопрос, но не смог найти ответ в любом месте сети.

Я пытаюсь использовать кэш-память второго уровня (с использованием EHCACHE) и просто проверил, что некоторые объекты были получены из базы данных каждый раз, когда я пытался их загрузить, единственное отличие было то, что я не получил их на ID, но имущество, которое несет. SEO Дружественное имя, которое используются для создания URL-адресов в системе, я работаю. Является ли JPA / Hibernate, способный извлечь объекты из кэша только с идентификатора OBJ? Есть ли способ получить его работать без необходимости активировать кэш запроса?

Это было полезно?

Решение

Является ли JPA / Hibernate, способный извлечь объекты из кэша только с идентификатора OBJ?

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

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

Со стандартным JPA я не вижу никакой другой варианты, чем использовать кэш запроса.

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

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

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

Смотрите также

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top