2014-10-02 76 views
1

我在使用Sybase(jTDS驱动程序)和某些数据时遇到了SimpleJdbcInsert.executeAndReturnKey的奇怪问题。使用SimpleJdbcInsert和Sybase检索生成的密钥问题

看看下面的例子:

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); 

,好像我做了一个insert.execute(params)插件将正常工作上面将失败,并

DataIntegrityViolationException: Unable to retrieve the generated key for the insert 

插入本身是好的(但我需要生成的列值)。

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

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

我还要补充一点,当我使用完全相同的代码与H2数据库它的工作原理所有的时间 - 这似乎

+0

您是否验证过Sybase和/或jTDS实际上是否支持生成密钥的检索? – 2014-10-02 19:07:02

+0

它确实支持它 - 如果你坚持的只是字符串,它确实有用。 – extols 2014-10-02 19:58:04

回答

1

我曾与SQL Server的同一问题涉及到的Sybase/JTDS并通过调用executeAndReturnKey()前右调用这个配置方法固定它:

mySimpleJdbcInsert.setAccessTableColumnMetaData(false); 

我怀疑错误与数据库中的元数据做的事:作为弹性参考http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jdbc.html解释,SimpleJdbcInsert类使用数据库的元数据来构造实际的Insert stateme NT。

人们还可以使用这样的SQL OUTPUT子句

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

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