séra possível?

Até hoje nunca achei uma forma, e já pesquisei um bocado em outras linguagens, de recuperar o valor de um campo auto numerado após inserir um registro no banco de dados.

Nunca pesquisei fazer isso em java… tem como fazer?

Boa tarde,

Você pode tentar sincronizar os métodos que fazem a operação de insert. Desta forma poderá inserir o valor, pesquisar o valor inserido com a garantia de que o método não estará sendo utilizado por mais ninguém.

Neste caso você deverá possuir um campo único, caso contrário, a pesquisa do valor não será possível.

Se o driver de JDBC suportar, você pode utilizar o método getGeneratedKeys do Statement.

Crie o seu proprio gerenciador de sequência, e faça o insert com o valor da chave já definido. Com isto vc consegue total independência de banco de dados.

[]s, Welington B. Souza

Só completando, o Hibernate tem um jeito muito legal de resolver isso - dê uma olhada nos Key Generators dele, é bem interessante. :slight_smile:

Talvez minha frase “Se o driver de JDBC suportar” tenha dado uma idéia errada. O driver JDBC deve suportar, pois isso foi incluído na última especificação de JDBC. Se você tem planos de usar bancos que mantenham seus drivers minimamente atualizados e compatíveis com a especificação, pode usar o método sem problemas.

Bom, eu sou a favor de deixar para o banco de dados as coisas que são “de banco de dados”, mas se quiser fazer tudo na mão, tudo bem também.

Nao sou o mestre em BD, mas discordo de voce Bani. Tenho minhas duvidas se campos auto incrementais sao uma especificacao de SQL Padrao, visto que uma serie de banco de dados nao tem essa feature (Oracle e Interbase/Firebase, por exemplo).
Acredito que a especificacao JDBC sempre foi pensada para seguir o SQL, e nao peculiaridades do mysql e do sql server. Acho que o JDBC 3 apareceu esse getGeneratedKeys por causa da pressao da comunidade, mas acho que poderiamos viver tranquilamente sem essa parada.
Caso alguem realmente queira funcionalidade de autoincremental em um bd, por algum motivo, pode usar o sequence ou generator do oracle / interbase , alimentando o campo num trigger.

[quote=“tanque”]Nao sou o mestre em BD, mas discordo de voce Bani. Tenho minhas duvidas se campos auto incrementais sao uma especificacao de SQL Padrao, visto que uma serie de banco de dados nao tem essa feature (Oracle e Interbase/Firebase, por exemplo).
[/quote]

A bani esta certa, nao foi isso que ela quis dizer.

O getGeneratedKeys deve retornar as chaves geradas pelo banco de dados, se alguma foi gerada. Se nao foi, nao retorna nada.

Na verdade, essa chamada apenas resulta um SELECT LAST_INSERTED_ID ou algo do tipo. O hibernate, para criar uma linha em duas tabelas que tem um relacionamento, chama esse tipo de SQL.

A ideia do wbsouza eh a melhor: controle voce mesmo seus IDs e livre-se de vez do nightmare que sao os diferentes tipos de sistemas de primary keys dos BDs. Alias, um SequenceGenerator eh super usado em EJBs

Eu havia entendido o ponto da Bani. A unica coisa que nao acho correto eh comecar a dobrar a API jdbc por causa dessa ou daquela feature daquele banco. Se o mane quer realmente puxar o id gerado automatico do banco, que ele mesmo de o SELECT @identity ou o select LAST_INSERT_ID.

Nesse ponto eu sou mais purista mesmo, pode me chamar de chato, mas prefiro programar em sql padrao. Soh falta daqui a pouco jdbc dizer que os bancos de dados tem que implementar a funcao Replace, coisa que acho que soh existe no Mysql.

Eh uma questao de opiniao pessoal. Ao inves de criar uma extensao para recuperar os auto incrementais, por que a sun nao bota um esquema de geracao de identificador massa, independente de banco de dados, na API, a la Hibernate entao? Isso sim, contemplaria melhor a necessidade, do que soh botar a naba do getGeneratedKeys. Essa funcoes tende a tornar o programador preguicoso e os programas inda menos portaveis do que ja sao.

[quote=“tanque”]
Eh uma questao de opiniao pessoal. Ao inves de criar uma extensao para recuperar os auto incrementais, por que a sun nao bota um esquema de geracao de identificador massa, independente de banco de dados, na API, a la Hibernate entao?[/quote]

To contigo e nao abro, tanque! Pensa que SQL era pra ser padrao… nós estamos muito atrasados em termos de independencia de banco de dados…

[]s!!