2012-02-19 24 views
5

Estoy tratando de insertar una fila en una tabla MySQL y obtener su ID de inserción. Conozco la función MySQL last_insert_id(), parece que no puedo hacer que funcione. Actualmente, estoy tratando de usar una función anotada como transacción y solo estoy obteniendo 0. Estoy usando Spring 3.1.Spring JdbcTemplate no puede obtener la Id. De inserción de MySQL

@Transactional (propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 
    private long insertTransactionRecord 
    (
     int custID, 
     int porID, 
     String date, 
     short crvID 
    ) { 
     m_template.update ("INSERT INTO " + 
          " transaction " + 
          "(" + 
          " por_id, " + 
          " cust_id, " + 
          " trans_date, " + 
          " crv_id " + 
          ") " + 
          "VALUES " + 
          "(" + 
          " ?, " + 
          " ?, " + 
          " ?, " + 
          " ? " + 
          ")", 
          new Object[] { 
           porID, 
           custID, 
           date, 
           crvID 
          }); 
     return m_template.queryForLong ("SELECT " + 
             " last_insert_id() " + 
             "FROM " + 
             " transaction " + 
             "LIMIT 1"); 
    } 

Respuesta

7

tomado de aquí http://www.codefutures.com/spring-dao/

public int createCompany(Company company) throws SQLException { 
     jdbcTemplate.update(
       "INSERT INTO company (name) VALUES (?)", 
       company.getName() 
     ); 
     return jdbcTemplate.queryForInt("select last_insert_id()"); 
    } 

si se dio cuenta que no hay FROM no

+0

El propósito de la cláusula 'FROM' es especificar la tabla de la que quiero la ID. 'JdbcTemplate' usa la agrupación de conexiones, por lo que no estoy seguro de que esté en la misma conexión. Se suponía que la transacción remediaría esto. Tu sugerencia no ha ayudado, gracias sin embargo. – Nik

+0

use jdbcTemplate.queryForObject ("select last_insert_id()", Integer.class) – singhspk

+0

No creo que ese enfoque sea seguro para subprocesos, ¿o sí? La llamada queryForInt (..) puede tener lugar después de que se hayan realizado varias inserciones y devuelva la ID errónea para la instrucción de inserción que se encuentra encima. –

1

The documentation revela que la sintaxis para obtener el ID de la última inserción es:

SELECT LAST_INSERT_ID()  
+0

Entiendo eso. No está funcionando en 'JdbcTemplate'. Funciona si lo ejecuto manualmente en el cliente MySQL. – Nik

+1

Si lo comprende, ¿por qué está utilizando 'SELECT last_insert_id() FROM transaction LIMIT 1'? –

+0

Porque 'JdbcTemplate' utiliza la agrupación de conexiones, por lo que no puedo garantizar que obtendré el ID de la tabla correcta. Incluir la cláusula 'FROM' funciona en el cliente MySQL. Hay publicaciones de blog que sugieren esta práctica. – Nik

9

Uso El soporte integrado de Spring para este rathe r que hacerlo tú mismo.

SqlUpdate insert = new SqlUpdate(ds, "INSERT INTO company (name) VALUES (?)"); 
insert.declareParameter(new SqlParameter(Types.VARCHAR)); 
insert.setReturnGeneratedKeys(true); 
// assuming auto-generated col is named 'id' 
insert.setGeneratedKeysColumnNames(new String[] {"id"}); 
insert.compile(); 
.... 
GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); 
insert.update(new Object[]{"test"}, keyHolder); 
System.out.println(keyHolder.getKey().longValue()); 
+2

Spring también tiene un ejemplo en el manual: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.html#jdbc-auto-genereted-keys – Christian

Cuestiones relacionadas