![](/img/trans.png)
[英]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.