Spring Data ReactiveCrudRepository сохраняет операцию, не сохраняя данные в базе данных Postgres

Для приведенного ниже кода операции 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();

}

}

4 ответа

save() Метод не сохраняет данную сущность, если вы установили идентификатор самостоятельно. Попробуйте установить значение идентификатора в ноль. (Это по крайней мере работает при использовании Long как тип для идентификатора.)

Я нашел решение проблем с 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;
    }
}

Если вы уже получили идентификатор, вы можете использовать некоторые @Transient в ваших объектах и ​​установите его в коде, чтобы указать, что объекты новые, путем возврата этого поля из isNew() метод.

Я столкнулся с этой же проблемой недавно. Это потому, что он делает обновление вместо вставки. Вы должны справиться с этим самостоятельно. См. Связанный вопрос: Почему Spring-data-jdbc не сохраняет мой объект Car?

установите для пула соединений r2dbc в вашем приложении значение falseЭто по умолчанию всегда верно, и в основном оно нестабильно, потому что на ранней стадии дает прерывистые результаты.

Другие вопросы по тегам