[英]Spring 3.2 retrieving auto-generated keys using SimpleJdbcInsert
[英]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.