2012-02-19 13 views
5

Próbuję wstawić wiersz do tabeli MySQL i uzyskać identyfikator wstawki. Zdaję sobie sprawę z funkcji MySQL last_insert_id(), po prostu nie mogę tego zmusić do działania. Obecnie próbuję użyć funkcji oznaczonej jako transakcja i otrzymuję tylko 0 zwróconych. Używam Spring 3.1.Spring JdbcTemplate Nie można uzyskać wstawienia identyfikatora z 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"); 
    } 

Odpowiedz

7

wzięty stąd 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()"); 
    } 

czy zauważyłeś nie ma FROM tam

+0

Celem klauzuli "OD" jest określenie tabeli, z której chcę mieć identyfikator. 'JdbcTemplate' używa łączenia połączeń, więc nie mam gwarancji, że znajduje się w tym samym połączeniu. Transakcja miała temu zaradzić. Twoja sugestia nie pomogła, dzięki. – Nik

+0

użyć jdbcTemplate.queryForObject ("select last_insert_id()", Integer.class) – singhspk

+0

Nie sądzę, że to podejście byłoby bezpieczne dla wątków, prawda? Wywołanie queryForInt (..) może nastąpić po wykonaniu wielu wstawień i zwróceniu niewłaściwego identyfikatora dla instrukcji insert powyżej. –

1

The documentation ujawnia, że ​​składnia uzyskania identyfikatora ostatni wkładka jest:

SELECT LAST_INSERT_ID()  
+0

Rozumiem to. Nie działa w 'JdbcTemplate'. Działa, jeśli uruchomię go ręcznie w kliencie MySQL. – Nik

+1

Jeśli rozumiesz to, dlaczego używasz 'SELECT last_insert_id() FROM LIMIT transakcji 1'? –

+0

Ponieważ 'JdbcTemplate' używa łączenia połączeń, więc nie mogę zagwarantować, że otrzymam identyfikator z właściwej tabeli. W tym klauzula 'FROM' działa w kliencie MySQL. Istnieją posty na blogu, które sugerują tę praktykę. – Nik

9

Wykorzystanie Wiosenna wbudowana obsługa tego rathe r niż robienie tego samemu.

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

Wiosna ma również przykład w instrukcji: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.html#jdbc-auto-genereted-keys – Christian

Powiązane problemy