DataRetrievalFailureException выбрасывается при сохранении сущности с идентификатором без автоинкремента в базе данных Oracle - PullRequest
0 голосов
/ 18 октября 2018

Я использую Spring Data JDBC с базой данных Oracle и устанавливаю собственный идентификатор для своей сущности с процессором BeforeSaveEvent.

@Bean
public DataFieldMaxValueIncrementer incrementer() {
    OracleSequenceMaxValueIncrementer incrementer = new OracleSequenceMaxValueIncrementer();

    incrementer.setDataSource(metahubDatasource());
    incrementer.setIncrementerName("TL_SEQ");

    return incrementer;
}

@Bean
public ApplicationListener<?> idSetting() {

    return (ApplicationListener<BeforeSaveEvent>) event -> {

        if (event.getEntity() instanceof TL) {
            setIds((TL) event.getEntity());
        }
    };
}

private void setIds(TL tl) {
    tl.setId(incrementer().nextLongValue());
}

Когда я пытаюсь сохранить эту сущность, генерируется исключение, приведенное ниже.

  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:79)
    at org.springframework.data.jdbc.core.DefaultDataAccessStrategy.getIdFromHolder(DefaultDataAccessStrategy.java:323)
    at org.springframework.data.jdbc.core.DefaultDataAccessStrategy.insert(DefaultDataAccessStrategy.java:111)
    at org.springframework.data.jdbc.core.DefaultJdbcInterpreter.interpret(DefaultJdbcInterpreter.java:73)
    at org.springframework.data.relational.core.conversion.DbAction$InsertRoot.doExecuteWith(DbAction.java:110)
    at org.springframework.data.relational.core.conversion.DbAction.executeWith(DbAction.java:55)
    ...

Как настроить столбец сгенерированного ключа, чтобы избежать этого исключения, или как настроить, что нетожидается сгенерированный ключ?

1 Ответ

0 голосов
/ 19 октября 2018

Кажется, проблема в том, что Oracle ведет себя по-другому, чем другие базы данных, используемые в интеграционных тестах Spring Data JDBC.

В настоящее время ведется работа по включению Oracle в интеграционные тесты ,Как только это станет доступно, оно либо решит проблему напрямую, либо разрешит ее исправить.

Тем временем, вероятно, единственное, что вы можете сделать, - это самостоятельно установить исправление Spring Data JDBC, настроив DefaultDataAccessStrategy.getIdFromHolder* 1009.* чтобы он не ошибался при отсутствии идентификатора.

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