spring - 使用 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
});
}
我希望得到保存的用户,我该怎么做
解决方案
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>
发出保存(更新)的对象,其中包含一个生成的 Id。
通常,我们建议使用不可变对象以避免可见性和共享可变状态问题。当 Spring Data 需要将数据传播回对象时,Spring Data 利用 Lombok 的@Wither
模式创建一个新的对象实例。
也可以看看:
- Spring Data R2DBC:
PostgresR2dbcRepositoryIntegrationTests
推荐阅读
- flutter - 从 Dart 中的 pem 编码字符串获取 ECDSAPublicKey、ECDSAPrivate
- python - 在 django 中实现评级
- c - 将函数名中的前缀与宏连接起来?
- azure-devops - VSTS:需要为他们的任务分配给故事的用户列表
- node.js - 在 node.js 中使用 geo.find() 时没有及时得到响应
- excel - 结果表中仅重复项的累积数量
- c# - 如何用逗号解析双字符串?
- node.js - 我需要将 AWS 开发工具包导入 lambda
- r - 使用 ggplot2 分组条形图:每年将两个数值变量分组
- javascript - 如何使用从 JSON 响应的对象数组中获取值