Hibernate trazendo objeto antigo

3 respostas
marcio.rga

Olá amigos,

Estou desenvolvendo meu projeto final, com struts 2 e hibernate.
Tenho dois problemas críticos, que estão me tirando o sono.

O primeiro, quando atualizo um objeto o hibernate atualiza no banco de dados mas quando dou um "findById" ele me retorna o objeto antigo sem as alterações que foram alteradas.

Segue o código do método de atualização:
Obs: Ao alterar um cliente, excluo todos seus telefones e incluo novamente os que estão presentes na tela (métodos excluirTelefones e incluirTelefones)

try {
			HibernateSessionFactory.getSession().getTransaction().begin();
			
			cCliente = recuperarFscPorId(cCliente.getCd());
			cCliente.setNm(cCliente.getNm());
			cCliente.setDtNasc(cCliente.getDtNasc());
			cCliente.setEmail(cCliente.getEmail());
			cCliente.setDcr(cCliente.getDcr());
			cCliente.setLogd(cCliente.getLogd());
			cCliente.setUsuario(usuario);
			cCliente.setMaxCmp(cCliente.getMaxCmp());
			cCliente.setPlcVeic(MaskUtil.removeMask(cCliente.getPlcVeic()));
			cCliente.setCpf(MaskUtil.removeMask(cCliente.getCpf()));
			cCliente.setCep(MaskUtil.removeMask(cCliente.getCep()));
			cCliente.setSitCliente(getSitClienteDAO().findById(cdSitCli));
			//Caso o código da cidade seja nulo, indica que a cidade permanece a mesma
			if (cdCidade != null){
				cCliente.setCidade(getCidadeDAO().findById(cdCidade));
			}
			
			HibernateSessionFactory.getSession().saveOrUpdate(cCliente);
			excluirTelefones(cCliente.getCd());
			incluirTelefones(telefones, cdsTipTel, cCliente);
			HibernateSessionFactory.getSession().getTransaction().commit();
			HibernateSessionFactory.getSession().flush();
			HibernateSessionFactory.getSession().refresh(cCliente);
			
		} catch (Exception re) {
			HibernateSessionFactory.getSession().getTransaction().rollback();
			throw re;
		}

O outro erro é esta exceção também na hora de atualizar. Nem sempre ela aparece (isso é o que mata):

Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

Fico muito grato à aqueles que puderem me dar uma força!

Abraços!

3 Respostas

bsl.lacerda

Referente a Exceção - Me parece que o hibernate não está encontrando nenhum registro na tabela de clientes. Verifique o conteudo da tabela no BD.
Quanto a estar retornando o objeto antigo, debug o código nos passos onde você atualiza os dados do cliente para ver se este procedimento está seguindo da forma que você esperava. Espero ter ajudado.

marcio.rga

Bruno Lacerda:
Referente a Exceção - Me parece que o hibernate não está encontrando nenhum registro na tabela de clientes. Verifique o conteudo da tabela no BD.
Quanto a estar retornando o objeto antigo, debug o código nos passos onde você atualiza os dados do cliente para ver se este procedimento está seguindo da forma que você esperava. Espero ter ajudado.

Bruno valeu pela resposta!
Quanto a exceção verifiquei que na hora de excluir os telefones do cliente a lista não vem (isso não ocorre todas as vezes).
Já o problema do objeto antigo já debuguei e ele realmente vem do hibernate assim /:.

Já testei dar um commit para cada operação (incluir, excluir) quando dava o commit, verificava no banco para ver se os registros foram atualizados, e estavam.

Será que isso tem algo a ver com o fetch type? Pelo que notei o hibernate é lazy por default, será que seria uma boa passar para eager?

Obrigado mesmo pela atenção!

lucasap2005

O Hibernate por default habilita o cache nivel 1 em sua aplicação.
Eu usei session.flush() após usar session.update(object) e resolveu meu problema.
O session.flush() segundo a documentação força o seu objeto a sincronizar e mudar seu estado de acordo com a base de dados.

Tente isso, se não conseguir poste novamente.
Abraços

Criado 24 de maio de 2008
Ultima resposta 24 de mai. de 2008
Respostas 3
Participantes 3