繁体   English   中英

使用SimpleJdbcInsert和Sybase检索生成的密钥时出现问题

[英]Issue retrieving generated keys with SimpleJdbcInsert and Sybase

我在使用带有Sybase(jTDS驱动程序)和某些数据的SimpleJdbcInsert.executeAndReturnKey时遇到了一个奇怪的问题。

请看以下示例:

SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbcTemplate)
    .withTableName("TABLE_NAME")
    .usingGeneratedKeyColumns("ID");

List<String> columns = new ArrayList<String>();
    columns.add("SOME_NUMERIC_DATA");
    columns.add("SOME_STRING_DATA");

Map<String, Object> params = new HashMap<String, Object>();
params.put("SOME_NUMERIC_DATA", 10.02);
params.put("SOME_STRING_DATA", "AAAA");

Number insertId = insert.executeAndReturnKey(params);

以上将失败

DataIntegrityViolationException: Unable to retrieve the generated key for the insert

插入本身很好,就像我执行insert.execute(params) ,插入将正常工作(但我需要生成的列值)。

如果我为SOME_NUMERIC_DATA列插入null而不是10.02 ,则它将正常工作并返回生成的列值。 同样,如果所有字段都是VARCHAR / String则它将正常工作。

任何人都可以在这里看到任何由字符串和数字字段组合导致的问题。

我还应该补充一点,就是当我在H2数据库中使用完全相同的代码时,它始终有效-这似乎与Sybase / jTDS有关

我在使用SQL Server时遇到了同样的问题,并通过在调用executeAndReturnKey()之前立即调用此配置方法来解决此问题:

mySimpleJdbcInsert.setAccessTableColumnMetaData(false);

我怀疑错误与数据库元数据有关:如spring参考http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jdbc.html中所述 ,SimpleJdbcInsert使用数据库元数据来构造实际的插入语句。

也可以使用SQL OUTPUT子句,例如

INSERT INTO myTable (Name, Age)
OUTPUT Inserted.Id
VALUES (?,?)

并使用一些更通用的JdbcTemplate.execute()来处理插入。

暂无
暂无

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

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