JPA/Hibernate - Os objetos são instâncias em cache indexadas apenas por ID?
-
25-09-2019 - |
Pergunta
Provavelmente é uma pergunta básica, mas não conseguiu encontrar a resposta em nenhum lugar da web.
Estou tentando usar um cache de segundo nível (usando o ehcache) e verifiquei se alguns objetos estavam sendo recuperados do banco de dados toda vez que eu tentava carregá -los, a única diferença era que não os estava obtendo por id, mas por uma propriedade que carrega Um nome amigável de SEO usado para criar URLs no sistema que estou trabalhando. O JPA/Hibernate é capaz de recuperar objetos do cache apenas com o ID do OBJ? Existe alguma maneira de fazê -lo funcionar sem a necessidade de ativar o cache de consulta?
Solução
O JPA/Hibernate é capaz de recuperar objetos do cache apenas com o ID do OBJ?
Sim, o cache do segundo nível funciona para a consulta que procura um único objeto baseado em Id
ou seja, quando estiver usando EntityManager.find()
ou EntityManager.getReference()
(ou o equivalente Session#get()
e Session#load()
da API de hibernato). Afaik, isso se aplica a todas as implementações da JPA.
Existe alguma maneira de fazê -lo funcionar sem a necessidade de ativar o cache de consulta?
Com o JPA padrão, não vejo outra opção além de usar o cache de consulta.
Mas se você não se importa de usar a API de Hibernate, pode haver uma alternativa com Query#iterate()
. Com Query#iterate()
, O Hibernate emitirá uma consulta SQL que buscará apenas os IDs e, quando você iterar sobre os resultados, ele carregará as entidades correspondentes do cache.
Obviamente, Query#iterate()
será muito mais lento do que Query#list()
Se você não estiver usando um cache de segundo nível.
Pessoalmente, eu usaria o cache de consulta.