首页 > 解决方案 > 使用 Postgresql 使用 Spring Data R2DBC 保存对象时如何检索生成的 ID

问题描述

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

我有一个实体类:

@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
        });
}

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

标签: springreactiver2dbc

解决方案


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

在你的情况下,这将是:

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

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

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

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

也可以看看:


推荐阅读