4
respostas

Problema com OptimisticLockException

Olá, pra aprender java, estou desenvolvendo uma aplicacao web que permite profissionais ter um sistema pra gerenciar seu escritorio. O profissional cria o seu perfil, e cria seu escritorio, tipo uma fanpage. Estou com uma exception de lookOtimista:

Esse escritorio tera acesso a todos os Perfis cadastrados na aplicacao. Chamei todos os clientes de Perfil, e os Perfis que sao clientes do seu Escritorio, de Cliente. O Escritorio terá acesso a todos os Perfis, mas não saberá se esses perfis são clientes de outros escritorios, só saberá se é ou não seu cliente.

Alem de Cliente, o Escritorio terá tambem Orcamentos, entre outros.

Entao, quando o Escritorio gerar um Orcamento , ele tera que adicionar um Cliente nesse Orcamento. Minha logica faz com que, o Escritorio busque o Perfil, e verifique se esse Perfil é seu Cliente, se nao for, ele adiciona esse Perfil a lista de seus Clientes.

Problema: Acesso o Escritorio, abro um novo Orcamento, e busco um Perfil e verifico se ele é Cliente, senao adiciono um novo Cliente, entao preencho o orcamento, e salvo, da certo. Clico em novo Orcamento, insiro outro cliente, salvo, da certo.

Mas quando clico em NOVO Orcamento, e escolho o mesmo Cliente do Orcamento anterior, ele da a javax.persistence.OptimisticLockException.

Quando eu busco o cliente a primeira vez, como ha de se esperar, ele busca no db, mas na segunda, ele já pega no cache.

Nao pus o codigo, porque acho que nao estou conseguindo resolver porque me falta alguns conceitos, se eu entender melhor o conceito, acredito que consigo achar o erro.

MInhas duvidas: 1) Quando eu salvo um objeto que ja estava no cache, alterando sua versao, ele salva no db e atualiza a versao do seu equivalente no cache? 2) Quando eu busco esse objeto que acabei de salvar, ele busca no db, ou no cache? Como fica a versao dele? 3) O fato do hibernete manter um objeto no cache pode ser fonte de OptimisticLockException? 4) Uso o springMVC, e JSF. As servlet CONTROLLERS, sao gerenciadas e injetadas pelo spring. Ë possivel, eu acessar o objeto que abstrai o cache do hibernate que esta vinculado a sessao do ClienteController? Se sim, como faço pra acessar todos os atributos e metodos desse objeto? Pra por exemplo, eu zerar o cache via codigo!

Antecipadamento agradeco pela resposta...

4 respostas

O hibernate não vai atualizar nenhum atributo seu, a menos que vc mande... Então vc sempre vai ter que carregar o objeto do banco antes de atualizar, para pegar a próxima versão.

Mas se eu busco o objeto no db, e ele já esta no cache do hibernete, ele trará o objeto do cache em vez de buscar no db, e continuará dando OptimisticLockException.

Estou lidando com esse problema nesse momento, e vi que se eu der um em.clear() ou em.refresh(cliente) soluciona o problema.

Mas como parece ser um problema recorrente, queria saber se tem uma solucao padrao para essa situacao?

então, a padrão é buscar o objeto de novo... não conheço outra estratégia.

Sim, isso entendi, a questao é que quando busca o objeto novamente, ele pega do cache, em vez de buscar no db, e continua dando a OptimisticLockException.