Quarkus Reactive中如何实现无重复记录时的数据持久化?
解决Quarkus Reactive中无重复记录时插入数据的问题
你的代码问题在于:当查询到已存在的记录时,.failWith()会直接终止整个响应式流,后续的call()和chain()操作根本不会执行。而我们需要的逻辑是仅当记录不存在时才执行插入,因此要调整响应式流的分支处理逻辑。
修改后的代码如下:
@ApplicationScoped public class MovieRepositories implements IMovieRepositories { @Inject MovieMapper mapper; @Override public Uni<Object> create(MovieEntity entity) { final var data = mapper.toEntity(entity); return MovieEntity.find("name=?1 and deleted_at is null", entity.getName()) .firstResult() // 如果查询到记录,抛出重复异常 .onItem().ifNotNull().failWith(() -> new ValidationException("Movie already exist")) // 如果查询结果为null,执行插入操作 .onItem().ifNull().call(() -> MovieEntity.persist(data)) // 插入完成后返回新记录的ID .chain(() -> Uni.createFrom().item(data.getId())); } }
关键逻辑说明:
- 先执行查询操作,确认是否存在目标记录
- 使用
onItem().ifNotNull().failWith()在记录存在时抛出异常,终止流 - 使用
onItem().ifNull().call()在记录不存在时触发持久化操作 - 最后通过
chain()返回新插入记录的ID,保证响应式流的连贯性
这样调整后,只有当数据库中不存在对应记录时,才会执行插入操作;若存在则直接抛出异常,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Anton Wijaya
相关产品推荐
相关产品推荐

