简体   繁体   中英

Issue retrieving generated keys with SimpleJdbcInsert and Sybase

I'm having an odd problem with SimpleJdbcInsert.executeAndReturnKey with Sybase (jTDS driver) and certain data.

Take the following example:

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

The above will fail with

DataIntegrityViolationException: Unable to retrieve the generated key for the insert

The insert itself is fine as if I do an insert.execute(params) the insert will work correctly (but I need the generated column value).

If I insert null instead of 10.02 for the SOME_NUMERIC_DATA column then it will work correctly and return the generated column value. Also if all of the fields are VARCHAR / String then it will work correctly.

Can anyone see anything here that might be causing this with a combination of string and numeric fields.

I should also add that when I use the exact same code with an H2 database it works all of the time - this seems to be related to Sybase/jTDS

I had the same problem with SQL Server and fixed it by calling this configuration method right before the call to executeAndReturnKey() :

mySimpleJdbcInsert.setAccessTableColumnMetaData(false);

I suspect the error has to do with database metadata : as explained in the spring reference http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jdbc.html , SimpleJdbcInsert uses database metadata to construct the actual insert statement.

One could also use the SQL OUTPUT clause such as

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

And use some more generic JdbcTemplate.execute() to handle the insert.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM