Verificar se um objeto já foi gravado sem dar select

3 respostas
E

Existe alguma forma de verificar se um objeto já foi persistido sem dar select no banco de dados nem usar variáveis de controle (tipo o id)?

3 Respostas

E

Esqueci de avisar… Usando Hibernate 3

Y

Nao entendi bem a pergunta. Voce quer saber se aquela instancia do objeto com a qual voce esta trabalhando no momento ja foi gravada?

Nesse caso sim, deixando por conta de uma das alternativas do hibernate de gerar o id, ele sabera que aquele objeto ja foi persistido porque o id dele sera nulo (ou um valor que vc definir) enquanto ele for transient, apos ser persistido o id tera um valor. Entao ele sabe que os que tem id nulo nao foram gravados ainda. Se voce chamar um session.save(seuObjeto), ele ira gerar automaticamente um insert ou update dependendo da existencia ou nao do id.

Se voce quer saber se ja existe no banco um objeto com aquelas informacoes, (por ex: se um cliente com determinado cpf ja existe), a unica forma de fazer sem um select é tentar gravar e capturar a excecao se o banco levantar. Mas nesse caso o select é melhor porque o código e mensagem das excecoes variam de banco pra banco e voce vai ter dificuldade de saber se o erro foi realmente de violacao de unique.

Eu aconselho a fazer o select count, numa coluna indexada o custo é bem baixo.

Há tambem outra possibilidade, caso seja uma tabela pequena, de voce mante-la toda na memoria, e fazer a validacao antes de gravar. Mas nao acredito que seja o seu caso.

E

YvGa, o sistema em que eu trabalho usa outra política de geração de chaves, mesmo antes de persistir a propriedade “id” já está preenchida (e isso não pode ser alterado), quanto ao select é inviável, pois o custo de comunicação com o servidor de banco de dados é um pouco alto, o ideal seria se na API do hibernate tivesse um método que me desse o estado daquele objeto (persistido ou não persistido) tipo do ActiveRecord::Base do rails (Base.new_record?()).

Encontrei uma forma de fazer isto usando aspecto, mas deve ter como fazer isso usando a API do hibernate, porque em algum lugar ele tem que decidir se vai executar um INSERT ou SELECT. De qualquer forma, obrigado pela resposta.

Criado 19 de agosto de 2009
Ultima resposta 19 de ago. de 2009
Respostas 3
Participantes 2