2009-11-09 2 views
1

J'ai une table de base de données A qui stocke des enregistrements, A une clé primaire (enregistrement) avec auto_increment, chaque fois que j'insère un enregistrement dans A, j'obtiens l'enregistrement inséré et le stocke dans une autre table maître.Obtention du dernier ID d'enregistrement inséré d'une table de base de données dans Java?

J'utilise une instruction select comme moi bientôt un insert en A pour obtenir RECORDID comme ceci:

select RecordID d'un ordre par RecordID 1 DESC LIMIT;

Mais je suis tombé sur un problème aujourd'hui, où dans deux dossiers ont été insérés (par différents threads) en même temps et je fini par stocker mal RecordID dans l'ID maître (même RecordID pour les deux txns)

J'ai entendu parler de Statement.getGeneratedKeys(), je voudrais savoir si cela aide vraiment à résoudre le problème. Ou quelle est la meilleure façon de gérer cela.

Répondre

8

Vous pouvez utiliser la méthode getGeneratedKeys. Ce forum post aidera. Puis-je également vous recommander d'utiliser un outil ORM comme Hibernate?

Dans Hibernate vous feriez quelque chose comme ceci:

myTable = new myTable(); 
myTable.prop1 = prop1; 
myTable.prop2 = prop2; 
int id = session.save(myTable); 

Hibernate émettrons les commandes SQL appropriées (en fonction de la base de données sélectionnée) et vous retournez l'identifiant généré automatiquement.

+0

Si le pilote MySQL JDBC l'implémente. –

+0

C'est vrai. Si le pilote JDBC ne le prend pas en charge, vous devez utiliser des méthodes spécifiques à la base de données pour obtenir l'ID. – kgiannakakis

+0

@kgiannakakis - 'session.save (myTable)' ne retourne pas un 'int'. Cependant, elle renvoie java.io.serializable' et la méthode 'getGeneratedKeys()' n'est supportée par aucune implémentation des pilotes JDBC jusqu'à maintenant. Donc, aucun des deux cas que vous avez mentionnés ne sera aussi évident. Est-ce qu'ils fonctionnent vraiment? – Lion

3

Le pilote JDBC MySQL prend en charge la méthode getGeneratedKey(). Jetez un oeil à la section 20.3.5.1.4. Retrieving AUTO_INCREMENT Column Values du manuel MySQL où:

nous montre l'utilisation de la nouvelle méthode JDBC 3.0 getGeneratedKeys() qui est maintenant la méthode préférée à utiliser si vous devez récupérer les clés AUTO_INCREMENT.

1

Dans les bases de données qui ne prennent pas en charge generatedKeys vous pouvez être en mesure d'obtenir l'ID dans un paramètre de retour. Oracle par exemple fournit le RETURNING xxx INTO? syntaxe où xxx est le nom de votre colonne.