2010-03-11 10 views
10

Estoy usando JDBC y quiero insertar por lotes, pero necesito las claves generadas para la próxima ronda de insertos. ¿Hay alguna forma de lograr esto?¿Hay alguna forma de obtener las claves generadas cuando se utiliza Spring JDBC batchUpdate?

MapSqlParameterSource[] batchArgs ....

DAL.getNamedParameterTemplate().batchUpdate("INSERT INTO...", batchArgs);

Gracias

+0

Encontré su pregunta porque estoy buscando hacer lo mismo, pero Spring batchUpdate toma un BatchPreparedStatementSetter y no puedo encontrar la manera de devolver las claves generadas. Me pregunto si de alguna manera tienes que hacer esto tú mismo usando las funciones jdbc addBatch con las funciones Spring jdbcTemplate. ¿Encontraste una respuesta a tu pregunta? – titania424

Respuesta

0

Uso db sequences para agarrar el siguiente valor de clave principal y la utilizan en la instrucción de inserción.

+1

¿cómo puedo usar eso con la primavera? – MalcomTucker

+0

algo en esta línea: select seq.nextval en nextPrimaryKeyValue –

+0

Este enfoque no es atómico a menos que haga todo en una transacción (que debería bloquear toda la tabla, ni siquiera cerca de una solución ideal). Creo que lo que MalcomTucker está preguntando es si puedes hacer esto como pasar KeyHolder a una de las API de Spring Spring(). –

7

Spring framework gente attempted a solution a este problema. Pero abandonaron el intento cuando se hizo evidente que no hay forma de garantizar que la solución funcionará con todos los controladores JDBC. Esto se debe a que la especificación JDBC no garantiza que las claves generadas estarán disponibles después de una actualización por lotes. Los controladores JDBC son libres de implementar esta función como lo consideren apropiado. En algunos casos, la base de datos subyacente podría no devolver las claves generadas, lo que imposibilitaría que el controlador admita esta función.

Por lo tanto, incluso si está trabajando directamente con JDBC, deberá comprobar si su base de datos y el controlador JDBC hacen que las claves generadas estén disponibles.

Recuerdo que pude lograr esto con el controlador JDBC de MySQL 5.0 con cierto esfuerzo, pero nunca integé la solución en nuestra aplicación de producción, ya que también teníamos que admitir versiones anteriores de MySQL.

Cuestiones relacionadas