You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:05:41