java - tras - ora-30673: la columna que desea modificar no es una columna de identidad
Acceso al campo de identidad de incremento automático después de insertar SQL en Java (5)
@ ScArcher2
Hacer una segunda llamada es extremadamente peligroso. El proceso de INSERT
y seleccionar las claves autogeneradas resultantes debe ser atómico; de lo contrario, puede recibir resultados inconsistentes en la selección de tecla. Considere dos INSERT
asincrónicas donde ambas se completan antes de que cualquiera tenga la oportunidad 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 no es algo que quieras hacer a mano, especialmente si estás utilizando una base de datos que admite la recuperación de claves generadas atómicamente (HSQLDB es la única que conozco que no).
¿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 de java.sql.Statement.executeUpdate
?
Sé cómo hacer esto en SQL para varias plataformas DB, pero me gustaría saber qué interfaces independientes de bases de datos existen en java.sql
para hacer esto, y cualquier información sobre la experiencia de las personas con esto en las plataformas DB.
@ ScArcher2: estoy de acuerdo, Hibernate necesita hacer una segunda llamada para obtener la nueva identidad generada A MENOS que se use una estrategia de generador avanzada (secuencia, hilo ...)
Siempre tuve 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.
El siguiente snibblet de código debería hacerte '':
PreparedStatement stmt = conn.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
// ...
ResultSet res = stmt.getGeneratedKeys();
while (res.next())
System.out.println("Generated key: " + res.getInt(1));
Se sabe que esto funciona en las siguientes bases de datos
- derby
- MySQL
- servidor SQL
Para las bases de datos donde no funciona (HSQLDB, Oracle, PostgreSQL, etc.), deberá utilizar trucos específicos de la base de datos. Por ejemplo, en PostgreSQL haría una llamada a SELECT NEXTVAL(...)
para la secuencia en cuestión.
Tenga en cuenta que los parámetros para executeUpdate(...)
son análogos.
ResultSet keys = statement.getGeneratedKeys();
Más tarde, simplemente itera sobre ResultSet.