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

时间:2019-04-09 14:03:14

标签: spring reactive r2dbc

能帮我解决以下问题吗?

我有一个实体类:

@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 个答案:

答案 0 :(得分:1)

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模式创建一个新的对象实例。

另请参阅: