Как получить сгенерированный идентификатор при сохранении объектов с помощью 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: An INSERT операция возвращает сгенерированные значения как Map<String, Object> сопоставляя имена столбцов со значениями. Вы должны извлечь Id самостоятельно.
  • С помощью R2dbcRepository: Сохранение нового объекта возвращает Mono<T> который испускает сохраненный (обновленный) объект, который содержит сгенерированный идентификатор.

В общем, мы рекомендуем неизменяемые объекты, чтобы избежать проблем с видимостью и общим изменяемым состоянием. Spring Data использует Lombok's @Wither шаблон для создания нового экземпляра объекта, когда Spring Data необходимо распространить данные обратно на объект.

Смотрите также:

  • Spring Data R2DBC: PostgresR2dbcRepositoryIntegrationTests
Другие вопросы по тегам