Я использую 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)
...
Как настроить столбец сгенерированного ключа, чтобы избежать этого исключения, или как настроить, что нетожидается сгенерированный ключ?