对于以下代码,存储库中的Get和update操作可以正常工作。但是保存操作不会将数据持久化到表中。如果我自己实施存储库,则效果很好。用扩展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();
}
}
答案 0 :(得分:0)
如果您自己设置ID,则 Symbol Subject Broadcast Date/Time
0 CUMMINSIND Financial Result Updates 06-Feb-2019 18:31
1 IGL Financial Result Updates 06-Feb-2019 17:16
方法不会保存给定的实体。尝试将id值设置为null。 (至少在使用save()
作为ID类型时有效。)
答案 1 :(得分:0)
我最近也遇到了同样的问题。 这是因为其进行更新而不是插入。您需要自己处理。 查看相关问题:Why does Spring-data-jdbc not save my Car object?
答案 2 :(得分:0)
我在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()
方法返回该字段来指示对象是新的。