Используя KeyHolder Spring с программно сгенерированными первичными ключами

Я использую 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)

Какие-либо идеи, что я пропускаю?

8
задан skaffman 12 May 2010 в 14:13
поделиться

2 ответа

Думаю, вы используете неправильный метод в JdbcTemplate . Единственный из методов update , который, казалось бы, соответствует вашему фрагменту кода, - это

int update(String sql, Object... args)

. Если это так, вы передаете params и ключ как два -element vargs array, и JdbcTemplate обрабатывает ключ как обычные параметры связывания и неправильно интерпретирует его.

Единственный общедоступный метод update на JdbcTemplate , который принимает KeyHolder , - это

int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)

, поэтому вам нужно перефразировать свой код, чтобы использовать его.

-3
ответ дан 5 December 2019 в 08:51
поделиться

Необходимо выполнить 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);

Более подробную информацию можно найти здесь в справочной документации.

2
ответ дан 5 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: