简体   繁体   English

Springs SimpleJdbcInsert不会按预期产生自动生成的密钥

[英]Springs SimpleJdbcInsert doesn't produce auto-generated keys as expected

I'm using springs SimpleJdbcInsert to execute an JDBC insert and return 2 auto-generated keys. 我正在使用springs SimpleJdbcInsert执行JDBC插入返回2个自动生成的键。

The command I use is: 我使用的命令是:

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

But keys only contains one key named SCOPE_IDENTITY() 但是keys仅包含一个名为SCOPE_IDENTITY()密钥

The logs seem to indicate that things are going well, except that the auto-generated keys for TRANSACTIONID AND ROWID don't get populated, here are some relevant logs 日志似乎表明一切正常,除了未填充TRANSACTIONID和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

This was an issue with the H2 database I am using. 这是我正在使用的H2数据库的问题。 It does not support returning more than one auto generated key. 它不支持返回多个自动生成的密钥。

Try this. 尝试这个。

This is a complete save method which saves companyCarrier object with two properties set. 这是一个完整的保存方法,该方法保存带有两个属性集的companyCarrier对象。 These properties have datatypes of Integer and String. 这些属性的数据类型为Integer和String。

Generated key is then set on the id property of the companyCarrier object. 然后,在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");
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM