Hibernate - problema ao dar Save

10 respostas
vinicius_roc

Pessoal preciso de uma sugestão de vocês
Eu tenho o seguinte for:

for (Integer idPlano : checkbox) {
				
				OdontoPlanoValor planoValor = new OdontoPlanoValor();
				planoValor.setIdPlano(idPlano);
				
				OdontoPlanoCotacao planoCotacao = new OdontoPlanoCotacao();
				planoCotacao.setPlano(planoValor);
				planoCotacao.setPropostaCotacao(propostaCotacao);
				
				cotacaoDentalService.save(planoCotacao);
			}

Ai ao tentar salvar pela segunda vez da erro, pois a chave é gerada automaticamente por uma outra classe, mapeada no *.hbm, que busca a MAX e acrescenta um. Até aqui eu entendi, ele da o erro porque ainda não comitou então a MAX não muda e a Id não pode repetir.

Agora vamos ao problema, se eu der um flush depois de salvar e na proxima der algum erro e tiver que fazer o rollback não vai adiantar certo? Como poderia fazer então para funcionar?

Outra duvida, se eu gerasse a chave no for funcionaria ou ele tentaria criar do mesmo jeito?

Agradeço desde ja

10 Respostas

R

oi vinicius, posta ai seu cotacaoDentalService.save(planoCotacao);
vc esta iniciando uma transação e comitando antes de iniciar uma nova?

vinicius_roc

cotacaoDentalService.save(planoCotacao) é um simples session.save isto esta ok.

o problema é esse eu não posso comitar antes de criar a segunda, se não caso de uma excessão o rollback não funcionaria. Eu preciso garantir que caso de uma excessão, volte tudo como antes com o rollback.

R

e se antes do for vc iniciar a transação e quando terminar vc comitar tudo

vinicius_roc

Então, é oque estou fazendo, mas como ainda não comitou o MAX que ele pega p gerar o id, não vai mudar, então ele vai tentar criar uma chave que ja existe.

Eu sei que se eu fazer um flush() funciona, mas caso precise fazer rollback não vai funcionar.

R

entao vai a gambi: rs
antes do for, vc precisa pegar o ultimo id criado
no for vc vai criando os objetos e ja setando os ids, é bom colocar em uma lista
e depois comita tudo.

vinicius_roc

Tambem pensei, tava querendo evitar isso. =/

Mas valew

Abss

thiagocg

vinicius_roc, pelo visto vc esta utilizando o hibernate, pq vc não usa a funcionalidade de geração automatica de chaves, assim vc não precisa utilizar nenhuma “gambiarra”.

[]'s

vinicius_roc

Ja esta para gerar automatico mas ele utiliza uma classe que pega o valor maximo da coluna chave para gerar. Então esse valor só vai mudar após inserir uma nova linha.

thiagocg

Acho que não entendi muito bem então o seu problema, pois se vc criar uma identificador auto-incremental no banco de dados e informar no mapeamento no hibernate, vc não vai precisar pegar valor maximo da tabela, pois isto é feito automaticamente, e caso vc precise desse valor do objeto que foi persistido, apos a inclusão (save) o objeto ja terá o seu id.

[]'s

vinicius_roc

Então, o auto_increment não esta no banco, porque ele faz uma concatenação antes, e se mudarmos algo vai mexer no resto da aplicação

Criado 10 de agosto de 2009
Ultima resposta 10 de ago. de 2009
Respostas 10
Participantes 3