Spring Data ReactiveCrudRepository保存操作不将数据持久化在Postgres数据库中

时间:2019-01-29 08:12:18

标签: spring-data spring-data-r2dbc

对于以下代码,存储库中的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();

}

}

3 个答案:

答案 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() 方法返回该字段来指示对象是新的。