Может ли 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()
, если вы не используете кэш второго уровня.
Лично я бы использовал кэш запросов.
См. Также