Я использую NamedParameterJdbcTemplate Spring для выполнения вставки в таблицу. Таблица использует NEXTVAL на последовательности для получения первичного ключа. Я затем хочу, чтобы этот сгенерированный идентификатор пасовался назад мне. Я использую реализацию KeyHolder Spring как это:
KeyHolder key = new GeneratedKeyHolder();
jdbcTemplate.update(Constants.INSERT_ORDER_STATEMENT, params, key);
Однако, когда я выполняю этот оператор, я добираюсь:
org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]
at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:73)
Какие-либо идеи, что я пропускаю?
Думаю, вы используете неправильный метод в JdbcTemplate
. Единственный из методов update
, который, казалось бы, соответствует вашему фрагменту кода, - это
int update(String sql, Object... args)
. Если это так, вы передаете params
и ключ
как два -element vargs array, и JdbcTemplate
обрабатывает ключ
как обычные параметры связывания и неправильно интерпретирует его.
Единственный общедоступный метод update
на JdbcTemplate
, который принимает KeyHolder
, - это
int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)
, поэтому вам нужно перефразировать свой код, чтобы использовать его.
Необходимо выполнить JdbcTemplate.update(PreparedStatementCreator p, KeyHolder k)
.
Ключ, возвращенный из базы данных, будет вставлен в объект параметра KeyHolder
.
Пример:
final String INSERT_ORDER_STATEMENT
= "insert into order (product_id, quantity) values(?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator() {
public PreparedStatement createPreparedStatement(
Connection connection) throws SQLException {
PreparedStatement ps = connection.prepareStatement(
INSERT_ORDER_STATEMENT, new String[] { "id" });
ps.setInt(1, order.getProductId());
ps.setInt(2, order.getQuantity());
return ps;
}
}, keyHolder);
Более подробную информацию можно найти здесь в справочной документации.