Boa tarde.
Bem primeiramente quero pedir desculpas ao moderador caso esteja duplicando o assunto; mas pesquisei e não encontrei o que procurava.
tenho uma consulta em SQL nativo executada da sequinte forma :
@SuppressWarnings("unchecked")publicstaticStringgetParametro(Stringsigla)throwsEsferaException{Sessionsession=null;StringBuildersql=newStringBuilder();sql.append("select valor005 from t005parametro where sigla005 = '"+sigla+"'; \n");try{session=HibernateUtil.getSession();Objecto=session.createSQLQuery(sql.toString()).uniqueResult();if(o==null){returnnull;}else{returno.toString();}}catch(Exceptione){thrownewEsferaException(EsferaException.getMsg(e));}finally{session.close();}}
O que acontece é que a tabela t005parametro é alterada por um outro sistema; o hibernate não refaz a consulta e pega as informções de seu cache. O que resulta em informações inconsistentes .
Algém sabe como resolver isso ?
Agradeço a todos que responderem.
Pessoal … será que deu pra entender o que escrevi ?
Eu quero obrigar o hibernate a fazer a consulta no BD novamente.
Não quero que ele faça a busca dos dados no cache como está ocorrendo.
renanreismartins
deu sim amigo, achei interessante seu problema, até procurei rapidamente por uma solucao. sei q o hibernate tem cache de 1o e 2o nivel, bem como query cache… estou acompanhando o topico, vou estudar sobre o assunto caso encontre solucao eu posto aqui.
se vc encontrar, por favor compartilhe
abrassss
emanuelCruz
Tenta isto:
@SuppressWarnings("unchecked")publicstaticStringgetParametro(Stringsigla)throwsEsferaException{Sessionsession=null;StringBuildersql=newStringBuilder();sql.append("select valor005 from t005parametro where sigla005 = '"+sigla+"'; \n");try{session=HibernateUtil.getSession();Queryquery=session.createSQLQuery(sql.toString());//nao pesquisa no cache, vai direto ao bancoquery.setCacheMode(CacheMode.IGNORE);Objecto=query.uniqueResult();if(o==null){returnnull;}else{returno.toString();}}catch(Exceptione){thrownewEsferaException(EsferaException.getMsg(e));}finally{session.close();}}
joaoorso
Não … não Rolou
Implementei esse método com conexão via JDBC (sem usar o Hibernate); só assim consegui fazer funcionar direito.
O ruim é que agora fiquei com duas formas de conexão com o banco no projeto
POG… mas deu certo.
acho que o
query.setCacheMode(CacheMode.IGNORE);
deve apenas desabilitar o cache de segundo nível
assim como essas linhas que vão no hibernate.cfg.xml
List<Object> list = session.createSQLQuery(sql.toString()).list();
O problema é que as vezes quando depois de alterar um bem , vou consulta-lo novamente e ele aparece desatualizado.
Provavelmente devido ao cache do hibernate .
Alguém já passou por isso ?
Se o hibernate não identifica um insert ou update feito na mão . Por qual motivo ele permite que eu o faça ?
renanreismartins
amigo acredito que se vc chamar o metodo clear() do obj session de certo
abrassss
B
bKn
O hibernate identifica o comando, porém fica esperando por outro para que os execute todos de uma vez.
A sessão do hibernate é o cache de primeiro nível, que faz o que eu disse acima.
transaction.commit();
session.close();
Este código não está funcionando como deveria. Ao fechar a sessão, o hibernate executaria todos os comandos pendentes na sessão na base de dados. Provavelmente é alguma falha no seu HibernateUtil.
agodinho
Estou com um problema semelhante, contudo em uma view. Tenho definido duas entidades, a tabela principal e uma view em cima dessa tabela.
tentei session.evict( MinhaClasse.class) e até o clear e nada, volta sempre o resultado do cache.
achei uma property para o hibernate cfg mas ela desabilita TODO o cache do sistema e isso pode impactar na performance da app.
Em vez do tradicional HibernateUtils.getCurrentSession() estou usando o perigoso HibernateUtils.getSessionFactory().openStatelessSession() - eu digo perigoso porquê se algum desavisado fizer copy and paste de um método desses e executar alguma mudança na base ele pode melar todo meu cache ne?
Só acho que o hibernate DEVERIA ter alguma configuração pra dizer que eu não quero cache para uma determinada entidade. (ele não tem mesmo?)