【问题标题】:Issue retrieving generated keys with SimpleJdbcInsert and Sybase使用 SimpleJdbcInsert 和 Sybase 检索生成的密钥时出现问题
【发布时间】:2014-10-02 13:10:53
【问题描述】:

我在使用 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 相关

【问题讨论】:

  • 您是否验证过 Sybase 和/或 jTDS 确实支持检索生成的密钥?
  • 它确实支持它 - 如果你坚持的只是字符串,它确实有效。

标签: java spring jdbc sybase jtds


【解决方案1】:

我在使用 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() 来处理插入。

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多