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?
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
rjbcordeiro
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
rjbcordeiro
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