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

时间:2014-10-02 13:10:54

标签: java spring jdbc sybase jtds

我的SimpleJdbcInsert.executeAndReturnKey与Sybase(jTDS驱动程序)和某些数据存在奇怪问题。

采用以下示例:

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)插入将正常工作(但我需要生成的列值)。

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

任何人都可以通过字符串和数字字段的组合在这里看到任何可能导致此问题的内容。

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

1 个答案:

答案 0 :(得分: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()来处理插入。