Как получить сгенерированный первичный ключ, когда новая строка вставлена ​​в базу данных Oracle с помощью Spring JDBC? - PullRequest
2 голосов
/ 22 февраля 2012

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

public void save(User user) {
    // TODO Auto-generated method stub
    Object[] args = { user.getFirstname(), user.getLastname(),
            user.getEmail() };
    int[] types = { Types.VARCHAR, Types.VARCHAR, Types.VARCHAR };

    SqlUpdate su = new SqlUpdate();

    su.setJdbcTemplate(getJdbcTemplate());
    su.setSql(QUERY_SAVE);

    setSqlTypes(su, types);

    su.setReturnGeneratedKeys(true);
    su.compile();

    KeyHolder keyHolder = new GeneratedKeyHolder();

    su.update(args, keyHolder);

    int id = keyHolder.getKey().intValue();

    if (su.isReturnGeneratedKeys()) {
        user.setId(id);
    } else {
        throw new RuntimeException("No key generated for insert statement");
    }
}

Но это не работает, Это дает мне следующую ошибку.

The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]

Строка вставляется в базу данных правильно. Также я мог получить сгенерированный первичный ключ при использовании базы данных MS SQL, но тот же код не работает с ORACLE 11G.

Пожалуйста, помогите.

1 Ответ

1 голос
/ 22 февраля 2012

Как и в комментарии, oid rowid являются буквенно-цифровыми, поэтому их нельзя привести к целому числу.

Кроме того, вы не должны использовать сгенерированный rowid где-либо в вашем коде.Это не первичный ключ, который вы определили в таблице.

В MS SQL есть возможность объявить столбец как первичный ключ, который автоматически увеличивается.Это функциональность, которая не работает в Oracle.

Что я всегда делаю (независимо от того, поддерживает ли БД автоинкремент):

select sequenceName.nextval from dual

Значение, возвращаемое предыдущимоператор используется в качестве первичного ключа для оператора вставки.

insert into something (pk, ...) values (:pk,:.....)

Таким образом, мы всегда имеем pk после вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...