如何使用 Postgresql 使用 Spring Data R2DBC 保存对象时检索生成的 ID

Kha*_* Ly 4 spring reactive r2dbc

你能帮我解决下面的问题吗

我有一个实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @Id
    private Long id;
    private String name;
}
Run Code Online (Sandbox Code Playgroud)

我将其保存在 Postgresql 中,代码如下:

public Mono<User> save(User user){
        return databaseClient().inTransaction(db -> {
            return db
                .insert()
                .into(User.class)
                .using(user)
                //todo: return saved user
        });
}
Run Code Online (Sandbox Code Playgroud)

我希望获得保存的用户,我该怎么做

mp9*_*1de 5

Spring Data R2DBC 期望您的数据库返回生成的键。使用 Postgres 时,请确保声明一个生成 Id 本身的列,例如SERIAL.

在你的情况下,这将是:

CREATE TABLE user (
    id          serial CONSTRAINT id PRIMARY KEY,
    name        varchar(255) NOT NULL,
);
Run Code Online (Sandbox Code Playgroud)

根据您使用的 API,您可以使用各种方法检索 Id:

  • DatabaseClient:操作通过将列名映射到值INSERT来返回生成的值。Map<String, Object>您需要自己提取 Id。
  • 使用R2dbcRepository:保存新对象会返回一个Mono<T>发出保存(更新)对象的对象,其中包含生成的 Id。

一般来说,我们建议使用不可变对象来避免可见性和共享可变状态问题。@Wither当 Spring Data 需要将数据传播回对象时,Spring Data利用 Lombok 的模式创建新的对象实例。

也可以看看: