【问题标题】:How to retrieve a generated ID when saving objects with Spring Data R2DBC using Postgresql使用 Postgresql 使用 Spring Data R2DBC 保存对象时如何检索生成的 ID
【发布时间】:2019-04-09 14:03:13
【问题描述】:

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

我有一个实体类:

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

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

【问题讨论】:

    标签: spring reactive r2dbc


    【解决方案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&lt;String, Object&gt;。您需要自己提取 Id。
    • 使用R2dbcRepository:保存新对象会返回一个Mono&lt;T&gt;,该Mono&lt;T&gt; 会发出包含生成的Id 的已保存(更新)对象。

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

    另见:

    【讨论】:

      猜你喜欢
      • 2021-01-02
      • 2021-01-30
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 2019-10-05
      • 2021-05-31
      • 1970-01-01
      • 2018-04-09
      相关资源
      最近更新 更多