2011-03-30 2 views
1

JDBC 삽입을 실행하는 데 Springs SimpleJdbcInsert를 사용합니다. 은 2 개의 자동 생성 키를 반환합니다.스프링 SimpleJdbcInsert가 예상대로 자동 생성 키를 생성하지 않습니다.

내가 사용하는 명령은 다음과 같습니다

KeyHolder keys = insert.withTableName("TRANSACTION").usingGeneratedKeyColumns("TRANSACTIONID", "ROWID").executeAndReturnKeyHolder(params); 

그러나 keys 만 로그 가지 transactionId는 AND에 그 자동 생성 키를 제외하고, 잘려고하고 있다는 것을 시사한다 SCOPE_IDENTITY()

라는 이름의 하나의 키를 포함 ROWID가 채워지지 않습니다. 여기에 몇 가지 관련 로그가 있습니다.

DEBUG o.s.jdbc.core.simple.SimpleJdbcInsert - JdbcInsert not compiled before execution - invoking compile 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProviderFactory - Using GenericTableMetaDataProvider 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - GetGeneratedKeys is supported 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - GeneratedKeysColumnNameArray is supported for H2 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - Retrieving metadata for PRIMARY.DB/PUBLIC/TRANSACTION 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - Retrieved metadata: TRANSACTIONID 4 false 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - Retrieved metadata: CREDITS 3 true 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - Retrieved metadata: TXNTYPE -6 true 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - Retrieved metadata: CARDTXNID 12 true 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - Retrieved metadata: DATE 93 true 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - Retrieved metadata: ROWID 4 false 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - Retrieved metadata: CARDINFOID 4 true 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - Retrieved metadata: PAYMENTMETHOD -6 true 
DEBUG o.s.jdbc.core.metadata.TableMetaDataProvider - Retrieved metadata: USERID 4 true 
DEBUG o.s.jdbc.core.simple.SimpleJdbcInsert - Compiled JdbcInsert. Insert string is [INSERT INTO TRANSACTION (CREDITS, TXNTYPE, CARDTXNID, DATE, CARDINFOID, PAYMENTMETHOD, USERID) VALUES(?, ?, ?, ?, ?, ?, ?)] 
DEBUG o.s.jdbc.core.simple.SimpleJdbcInsert - JdbcInsert for table [TRANSACTION] compiled 
DEBUG o.s.jdbc.core.simple.SimpleJdbcInsert - The following parameters are used for call INSERT INTO TRANSACTION (CREDITS, TXNTYPE, CARDTXNID, DATE, CARDINFOID, PAYMENTMETHOD, USERID) VALUES(?, ?, ?, ?, ?, ?, ?) with: [10, 2, 64H80073VY322412Y, 2011-03-30 14:05:12.526, null, 2, null] 
DEBUG o.s.jdbc.core.JdbcTemplate - Executing SQL update and returning generated keys 
DEBUG o.s.jdbc.core.JdbcTemplate - Executing prepared SQL statement 
DEBUG o.s.jdbc.core.simple.SimpleJdbcInsert - Using generated keys support with array of column names. 
DEBUG o.s.jdbc.core.JdbcTemplate - SQL update affected 1 rows and returned 1 keys 

답변

1

이것은 내가 사용하고있는 H2 데이터베이스의 문제점이었습니다. 둘 이상의 자동 생성 키 반환을 지원하지 않습니다.

0

이것을 시도하십시오.

두 가지 속성이 설정된 companyCarrier 개체를 저장하는 완전한 저장 방법입니다. 이러한 속성에는 Integer 및 String 데이터 유형이 있습니다.

생성 된 키는 companyCarrier 개체의 id 속성에 설정됩니다.

Object[] args = { companyCarrier.getCompanyId(), 
      companyCarrier.getCarrierId() }; 
    Class<?>[] parameterTypes = { CompanyCarrier.class }; 
    int[] types = { Types.INTEGER, Types.VARCHAR }; 

    SqlUpdate su = new SqlUpdate(); 

    su.setJdbcTemplate(getJdbcTemplate()); 

    su.setSql(getSqlQuery(getClass(), "save", parameterTypes)); 

    setSqlTypes(su, types); 

    su.setReturnGeneratedKeys(true); 
    su.compile(); 

    KeyHolder keyHolder = new GeneratedKeyHolder(); 
    su.update(args, keyHolder); 
    int id = keyHolder.getKey().intValue(); 

    if (su.isReturnGeneratedKeys()) { 
     companyCarrier.setId(id); 
    } else { 
     throw new RuntimeException("No key generated for insert statement"); 
    } 
관련 문제