Falta de sincronia entre JPA e DB [RESOLVIDO]

6 respostas
marciosouzajunior

Pessoal, eu faço uma alteração no banco da seguinte forma:

minhaQuery = minhaEntityManager.createNamedQuery("Objeto.findByCodigo");
                minhaQuery.setParameter("codigo", codigo);
                Objeto objeto = (Objeto) minhaQuery.getSingleResult();

                minhaEntityManager.getTransaction().begin();
                objeto.setQuantidade(quantidadeNova);
                minhaEntityManager.getTransaction().commit();

Quando eu debugo a aplicação, logo após o commit eu vejo que o banco foi alterado.
Logo após eu faço uma consulta:

consultaQuery = minhaEntityManager.createNativeQuery("SELECT * FROM objeto WHERE codigo = " + codigo, Objeto.class);
        consultaList.clear();
        consultaList.addAll(consultaQuery.getResultList());

Mas o registro é retornado com o valor antigo, mesmo tendo sido alterado no banco.
Eu não uso cache na aplicação, tenho a seguinte configuração no persistense.xml:

<shared-cache-mode>NONE</shared-cache-mode>

Minha lista também tem aquele parametro observable marcado.
Eu percebi que se eu chamar o método clear no EntityManager depois do
commit, as alterações são refletidas mas em outros pontos da aplicação
não precisei fazer isso. Uma observação é que estes dados estão sendo
consultados numa view, mas acho que isso não interfere em nada.

6 Respostas

romarcio

Depois de alterar chama o método flush da sua minhaEntityManager.

marciosouzajunior

Chamei flush() mas não atualizou.

WRYEL

tenta colocar o flushMode:

minhaEntityManager. setFlushMode(FlushModeType.COMMIT); // alteração aqui
                minhaQuery = minhaEntityManager.createNamedQuery("Objeto.findByCodigo");
               
                minhaQuery.setParameter("codigo", codigo);
                Objeto objeto = (Objeto) minhaQuery.getSingleResult();

                minhaEntityManager.getTransaction().begin();
                objeto.setQuantidade(quantidadeNova);
                minhaEntityManager.getTransaction().commit();
marciosouzajunior

Também não deu com o FlushMode mas consegui resolver de outra maneira:

consultaQuery = minhaEntityManager.createNativeQuery("SELECT * FROM objeto WHERE codigo = " + codigo, Objeto.class); 
        consultaQuery.setHint("javax.persistence.cache.storeMode", "REFRESH");  // Inseri essa linha

De acordo com especificações nesta página: http://en.wikibooks.org/wiki/Java_Persistence/Caching

WRYEL

Ue, você setou “javax.persistence.cache.storeMode” mesmo afirmando que não usa cache? :shock:

marciosouzajunior

Não sei explicar o porque, vou dar uma estudada nos tipos de cache do JPA.

Criado 17 de abril de 2012
Ultima resposta 17 de abr. de 2012
Respostas 6
Participantes 3