2008-09-16 12 views
16

¿Algún consejo sobre cómo leer el campo de identidad de incremento automático asignado al registro recién creado de la llamada a través del java.sql.Statement.executeUpdate?Acceso al campo de identidad de incremento automático después de insertar SQL en Java

Sé cómo hacer esto en SQL para varias plataformas de bases de datos, pero me gustaría saber qué interfaces independientes de bases de datos existen en java.sql para hacer esto y cualquier aportación sobre la experiencia de las personas con esto en plataformas DB.

Respuesta

23

La siguiente snibblet de código debe hacer ya ':

PreparedStatement stmt = conn.prepareStatement(sql, 
           Statement.RETURN_GENERATED_KEYS); 
// ... 

ResultSet res = stmt.getGeneratedKeys(); 
while (res.next()) 
    System.out.println("Generated key: " + res.getInt(1)); 

Esto se conoce para trabajar en las siguientes bases de datos

  • Derby
  • MySQL
  • SQL Server

Para las bases de datos wher e no funciona (HSQLDB, Oracle, PostgreSQL, etc.), necesitará utilizar trucos específicos de la base de datos. Por ejemplo, en PostgreSQL haría una llamada al SELECT NEXTVAL(...) para la secuencia en cuestión.

Tenga en cuenta que los parámetros para executeUpdate(...) son análogos.

+0

Leve error tipográfico en la respuesta anterior "res.getInt (0)" debe ser "res.getInt (1)". No puedo editarme todavía. Algún día :) – Sean

+2

Estúpida API de 1 índice. Si tan solo hubieran escuchado la sabiduría de Dijkstra ... –

+0

Posiblemente la publicación anterior, pero ¿tiene un enlace al artículo de Dijkstra donde explica por qué las matrices de 0 índices son mejores, lo vi hace mucho pero no recuerdo dónde. – Triztian

0

Siempre he tenido que hacer una segunda llamada usando la consulta después de la inserción.

Puede usar un ORM como hibernar. Creo que hace esto por ti.

+0

Una segunda llamada es peligrosa porque se encuentra con problemas de sincronización. De manera óptima, obtener la clave generada automáticamente y el INSERT real debe ser atómico, ya sea como una operación o como dos dentro de la misma transacción (por ejemplo, PostgreSQL). –

+0

Todas las bases de datos con las que he trabajado admiten la identificación después de la inserción. La base de datos maneja la sincronización. Se basa en su conexión y en la última inserción. Por lo tanto, no es peligroso si su base de datos proporciona esa forma de acceder a los datos, o si está utilizando una transacción. – ScArcher2

0

@ ScArcher2: Estoy de acuerdo, Hibernate tiene que realizar una segunda llamada para obtener la identidad recién generado menos que se utilice una estrategia generador avanzado (secuencia, hilo ...)

2
ResultSet keys = statement.getGeneratedKeys(); 

Más tarde, simplemente iterar sobre Conjunto resultante.

+0

Guau, no sabía de eso. He estado trabajando con Java desde 1.2, y creo que no me di cuenta cuando se agregó este método. – ScArcher2

0

@ ScArcher2

Realizar una segunda llamada es extremadamente peligroso. El proceso de INSERT y la selección de las claves generadas automáticamente resultantes deben ser atómicas, de lo contrario, puede recibir resultados inconsistentes en la selección de tecla. Considere dos INSERT s asincrónicos donde ambos se completan antes de que cualquiera tenga la posibilidad de seleccionar las claves generadas. ¿Qué proceso obtiene qué lista de claves? La mayoría de los ORM entre bases de datos tienen que hacer cosas molestas como el bloqueo de hilos en proceso para mantener los resultados deterministas. Esto es no algo que desea hacer a mano, especialmente si está utilizando una base de datos que admite recuperación de claves generadas atómicamente (HSQLDB es el único que conozco que no).

+0

Esto es algo que maneja la base de datos. Incluso funciona con HSQLDB. Proporcionan una función de IDENTIDAD() a la que puede llamar después de insertar un valor para obtener la última identificación de inserción. Está en su documentación, y no es "extremadamente peligroso". Creo que estás mal informado. – ScArcher2

+0

Desafortunadamente, esa función IDENTITY() obtiene la última ID INSERT, es decir, la última que se insertó. Si dos subprocesos realizan inserciones de forma asincrónica, existirá la posibilidad de que un subproceso obtenga el ID para el otro. –

Cuestiones relacionadas