JPA / Hibernate - это объекты экземпляры кэшированы индексированы только по ID?
-
25-09-2019 - |
Вопрос
Вероятно, это основной вопрос, но не смог найти ответ в любом месте сети.
Я пытаюсь использовать кэш-память второго уровня (с использованием 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()
Если вы не используете кэш второго уровня.
Лично я бы использовал кэш запроса.