Как получить сгенерированный идентификатор при сохранении объектов с помощью Spring Data R2DBC с использованием Postgresql
Не могли бы вы помочь мне решить проблему ниже
У меня есть класс сущности:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@Id
private Long id;
private String name;
}
и я сохраняю его в Postgresql с кодом:
public Mono<User> save(User user){
return databaseClient().inTransaction(db -> {
return db
.insert()
.into(User.class)
.using(user)
//todo: return saved user
});
}
Я хочу получить спасенного пользователя, как я могу сделать
1 ответ
Spring Data R2DBC ожидает, что ваша база данных вернет сгенерированные ключи. При использовании Postgres убедитесь, что вы объявили столбец, который сам генерирует Id, например: SERIAL
,
В вашем случае это будет:
CREATE TABLE user (
id serial CONSTRAINT id PRIMARY KEY,
name varchar(255) NOT NULL,
);
В зависимости от того, какой API вы используете, вы можете получить Id различными способами:
DatabaseClient
: AnINSERT
операция возвращает сгенерированные значения какMap<String, Object>
сопоставляя имена столбцов со значениями. Вы должны извлечь Id самостоятельно.- С помощью
R2dbcRepository
: Сохранение нового объекта возвращаетMono<T>
который испускает сохраненный (обновленный) объект, который содержит сгенерированный идентификатор.
В общем, мы рекомендуем неизменяемые объекты, чтобы избежать проблем с видимостью и общим изменяемым состоянием. Spring Data использует Lombok's @Wither
шаблон для создания нового экземпляра объекта, когда Spring Data необходимо распространить данные обратно на объект.
Смотрите также:
- Spring Data R2DBC:
PostgresR2dbcRepositoryIntegrationTests