【发布时间】: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