4
respostas

ID - CHAVE PRIMÁRIA JÁ EXISTE

Galera é o seguinte, postei o projeto no Heroku e estou com um problema. Eu já tinha algum registros e decidi dar insert no banco de dados diretamente, e quando vou inserir os dados ele reclama que já existe um id ou seja uma chave primaria. Tive que rodar 45x até chegar o último registro ai salvou. Minha questão aqui é o hibernate não verifica isso ? Se não, tem alguma forma. Pois estou trabalhando com outro projeto e já fico preparado

4 respostas

Wilian, na verdade a responsabilidade de gerenciar o id é do banco. Se esta usando JPA , o ideal é deixar seus ids como @GeneratedValue

Eae professor, tive aula com você na Caelum, inclusive estava procurando seu e-mail aqui para entrar em contato.

Enfim, eu já deixei os i'ds assim,.

@GeneratedValue(strategy = GenerationType.IDENTITY)

Porém, conforme falei já tinha bastante dados em Excel e dei uma carga direta no banco. Ai quando fui inserir um pelo formulário deu erro.

Boa noite Wilian,

Lendo a documentação de GenerationType, vi que o GenerationType.IDENTITY associa primary keys (PKs) à entidade usando a coluna da base que é ID, o que talvez não funcione se você tiver uma PK composta ou que seja simples, mas não numérica.

Caso a sua base tenha suporte a Sequences, talvez o melhor seja usar GenerationType.SEQUENCE, que associa a PK da entidade a uma sequence da base. Vantagens:

1) Na base, você pode iniciar a sequence com max(id)+1 (valor máximo do ids atualmente na base + 1) por exemplo, e, a partir daí, o Hibernate vai pegando os próximos valores desta sequence.

2) Como é uma sequence, você não precisará ficar se preocupando com dar id+1 pra fugir do problema de violação de PK.

Ainda pesquisando sua dúvida, achei também este link, em que há uma outra anotação pra usar sequence no JPA: @SequenceGenerator.

Espero tê-lo ajudado a resolver o problema.

Abraço,

Rafael.

como já te disseram isso é responsabilidade do banco de dados. No Oracle eu faço o seguinte: 1- dou um select max no campo id, como o nome já diz isso te retorna o maior id que existe no banco 2- edito minha sequence e coloco o valor inicial maior que o max, ou seja quando a aplicação for utilizar a sequence ele já vai criar os registros apenas com os valores maiores que o max e o problema desaparece. 3- faça tudo isso com a aplicação parada obs: não sei qual o banco que utiliza, mas todos tem essa configuração do valor inicial das chaves primárias