Как получить сгенерированный идентификатор при сохранении объектов с помощью Spring Data R2DBC с использованием Postgresql - PullRequest
1 голос
/ 09 апреля 2019

Не могли бы вы помочь мне решить проблему ниже

У меня есть класс сущности:

@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 Ответ

1 голос
/ 18 апреля 2019

Spring Data R2DBC ожидает, что ваша база данных возвратит сгенерированные ключи. При использовании Postgres убедитесь, что объявлен столбец, который сам генерирует Id, например SERIAL.

В вашем случае это будет:

CREATE TABLE user (
    id          serial CONSTRAINT id PRIMARY KEY,
    name        varchar(255) NOT NULL,
);

В зависимости от того, какой API вы используете, вы можете получить Id различными способами:

  • DatabaseClient: операция INSERT возвращает сгенерированные значения как Map<String, Object> путем сопоставления имен столбцов со значениями. Вам нужно извлечь Id самостоятельно.
  • Использование R2dbcRepository: при сохранении нового объекта возвращается Mono<T>, который испускает сохраненный (обновленный) объект, который содержит сгенерированный идентификатор.

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

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

...