首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Springs SimpleJdbcInsert并不像预期的那样产生自动生成的密钥。

Springs SimpleJdbcInsert并不像预期的那样产生自动生成的密钥。
EN

Stack Overflow用户
提问于 2011-03-30 07:19:20
回答 2查看 2.3K关注 0票数 1

我使用springs来执行JDBC插入返回2自动生成的键。

我使用的命令是:

代码语言:javascript
复制
KeyHolder keys = insert.withTableName("TRANSACTION").usingGeneratedKeyColumns("TRANSACTIONID", "ROWID").executeAndReturnKeyHolder(params);

但是keys只包含一个名为SCOPE_IDENTITY()的密钥

日志似乎表明事情进展顺利,只是TRANSACTIONID和ROWID的自动生成密钥没有被填充,下面是一些相关的日志

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-21 08:06:38

这是我正在使用的H2数据库的一个问题。它不支持返回多个自动生成的键。

票数 1
EN

Stack Overflow用户

发布于 2011-03-30 07:29:02

尝尝这个。

这是一个完整的保存方法,它保存两个属性集的companyCarrier对象。这些属性具有整数和字符串的数据类型。

然后在companyCarrier对象的id属性上设置生成的密钥。

代码语言:javascript
复制
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");
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5483139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档