Hibernate - problema ao dar Save

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

[code]for (Integer idPlano : checkbox) {

			OdontoPlanoValor planoValor = new OdontoPlanoValor();
			planoValor.setIdPlano(idPlano);
			
			OdontoPlanoCotacao planoCotacao = new OdontoPlanoCotacao();
			planoCotacao.setPlano(planoValor);
			planoCotacao.setPropostaCotacao(propostaCotacao);
			
			cotacaoDentalService.save(planoCotacao);
		}[/code]

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

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

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.

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

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.

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.

Tambem pensei, tava querendo evitar isso. =/

Mas valew

Abss

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

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.

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

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