Conexión JDBC: Obtener id autoincremental

Jerony_2338 Mensajes publicados 9 Estado Miembro -  
Jerony_2338 Mensajes publicados 9 Estado Miembro -
Bonjour, je suis débutant, je cherche actuellement à me connecter et à interagir avec une base de données (j'utilise Firebird... pas très judicieux je le concède). J'ai une table Appartement avec les champs suivants (id(PK auto-incrément), idBatiment(FK table bâtiment), nb_chambres, surface_habitable). Mon problème est le suivant : lorsque je souhaite insérer un nouvel appartement dans ma BD, la méthode est censée me retourner l'id de l'appartement inséré, autrement dit, j'ai une méthode de ce genre
 // je ne mentionne que l'id du bâtiment dans lequel l'appartement se trouve, autrement dit tous les autres champs ont des valeurs par défaut String query = "Insert into Appartement(idBatiment) values(?)"; public Integer insertion(Appartement app){ // try catch + requête préparée PreparedStatement return id_appartement } 

Le souci c'est que je ne sais pas récupérer l'id de l'appartement. J'ai plusieurs idées, mais soit ça ne fonctionne pas, soit c'est pas du tout performant.

1. Fonctionne pas : jouer avec la classe Statement (Statement.RETURN_GENERATED_KEYS) + ResultSet, mais ne fonctionne pas avec la BD Firebird dû sans doute à la version Jaybird de Firebird qui est ancienne pour les méthodes que je souhaite appeler.
2. Peu performant, trop coûteux et dangereux (si plusieurs transactions se déroulent au même moment et que la valeur de mon générateur a changé entre temps) : ajouter une nouvelle requête du genre "Select gen_id(id_appartement, 0) from RDB$DATABASE" pour déterminer la dernière ligne insérée (pour mon auto-incrément, j'ai créé un générateur dans ma base de données, c'est ce qui m'assure l'unicité des valeurs).

Quelqu'un a une idée de comment je pourrais procéder ? Merci d'avance pour vos interventions !

1 respuesta

  1. KX Mensajes publicados 19031 Estado Moderador 3 020
     
    Hola,

    Puedes generar un UUID con Java, insertarlo en la base de datos y usarlo para recuperar el auto-incremento.

    Ver: https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/UUID.html
    --
    La confianza no excluye el control.
    0
    1. Jerony_2338 Mensajes publicados 9 Estado Miembro
       
      Hola,

      Gracias por tu intervención. Le eche un vistazo rápido, pero si entendí bien, es como si generara 2 claves (la del generador + la de UUID) para al final recuperar solo una, y según lo que he podido ver, la clave generada por el UUID es 4 veces más grande (128 bits) que un tipo primitivo entero. Así que me pregunto acerca de la legitimidad de su uso, especialmente en mi "contexto". El ejercicio que quería realizar era más bien recuperar directamente el ID del generador en la BDD y devolverlo. Sin embargo, no sé si hay algunos métodos en la clase UUID que permitan, entre otras cosas, recuperar directamente el ID del generador, como lo haría un ResultSet. Gracias de nuevo por el tiempo dedicado.
      0
      1. KX Mensajes publicados 19031 Estado Moderador 3 020 > Jerony_2338 Mensajes publicados 9 Estado Miembro
         
        Para recuperar el id generado en la base, la solución que ya has propuesto es Statement.RETURN_GENERATED_KEYS, pero si no se puede aplicar en Firebird, hay que encontrar formas alternativas que serán necesariamente una solución degradada, por ejemplo, con un segundo id.

        Y sí, el UUID es muy grande, pero es único entre todos los demás UUID en el mundo, mientras que tu id auto-incrementado solo es único para tu instancia de base de datos.
        0
    2. Jerony_2338 Mensajes publicados 9 Estado Miembro
       
      Gracias por tu intervención. Sí, sospecho que en un contexto "real" de una aplicación (lo cual no es aún el caso), el uso de UUID resulta ser más eficiente que un simple auto_incremento. De todos modos, gracias por la aclaración.
      0