spring-data - Spring Data ReactiveCrudRepository 保存操作未在 Postgres 数据库中持久保存数据
问题描述
对于以下代码,存储库中的获取和更新操作可以正常工作。但保存操作不会将数据持久化到表中。如果我自己实现存储库,它工作正常。将其替换为扩展 ReactiveCrudRepository 的接口后,开始出现此问题。我错过了什么吗?
@SpringBootApplication
public class ReactiveSqlApplication {
public static void main(String[] args) {
SpringApplication.run(ReactiveSqlApplication.class, args);
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table("store")
class Store {
@Id
private String id;
private String name;
private String description;
}
interface StoreRepository extends ReactiveCrudRepository<Store, String> {
}
@Configuration
@EnableR2dbcRepositories
class R2dbcConfiguration extends AbstractR2dbcConfiguration {
private final ConnectionFactory connectionFactory;
R2dbcConfiguration(ConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
@Override
public ConnectionFactory connectionFactory() {
return this.connectionFactory;
}
}
@Configuration
class ConnectionFactoryConfiguration {
@Bean
ConnectionFactory connectionFactory() {
PostgresqlConnectionConfiguration config = PostgresqlConnectionConfiguration.builder()
.host("localhost")
.port(5433)
.database("testdb")
.username("postgres")
.password("root")
.build();
return new PostgresqlConnectionFactory(config);
}
}
代码测试如下:
@SpringBootTest
@RunWith(SpringRunner.class)
public class StoreRepositoryTest {
@Autowired
private StoreRepository repository;
@Test
public void all() {
Flux<Store> storeFlux = Flux.just(new Store("1", "a1", "a1"), new Store("2", "a2", "a2"))
.flatMap(store -> repository.save(store));
StepVerifier
.create(storeFlux)
.expectNextCount(2)
.verifyComplete();
Flux<Store> all = repository.findAll();
StepVerifier
.create(all)
.expectNextCount(2)
.verifyComplete();
}
}
解决方案
我在 github 问题上找到了一些解决方案:
https ://github.com/spring-projects/spring-data-r2dbc/issues/218
似乎您可能想要Persistable
为您的模型对象实现,因为您应该以某种方式告诉框架您的课程是新的,应该存储。这是上面链接中的示例代码:
@Data
@Table("sessions")
@NoArgsConstructor
public class Session implements Persistable<UUID> {
@Id
private UUID id;
private String name, speakers;
@Override
public boolean isNew() {
boolean result = Objects.isNull(id);
this.id = result ? UUID.randomUUID() : this.id;
return result;
}
}
如果您已经收到一个 id,您可以在您的实体中使用一些字段并在代码中设置它以通过从方法@Transient
返回该字段来指示对象是新的。isNew()
推荐阅读
- integration-testing - 不能使用变量测试退出柑橘重复直到语句
- java - JLabels 数组不会显示
- swift - 如何使用 didSet 更新 UIButton 的 .setTitle?
- javascript - 如何在 Javascript 中从没有破折号(-)和冒号(:) 的 ISO 日期字符串中获取日期对象
- javascript - 在 Experss.js + Mongodb 上对对象进行排序的最佳实践
- docker - 无法部署 Dockerfile: path/to/Dockerfile': ADD failed temp/path/to/app :: 没有这样的文件或目录
- vue.js - vue i18n 语言环境未更新
- python - 使用 Numpy 将包含 Groupby 和计数参数的列添加到数据框中
- asp.net-mvc - 为什么内联编辑模式下的 KENDO Grid 不传递新用户?
- javascript - vis.js Network (react-vis-network) 为什么 beforeDrawing 触发多次?