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