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

Quarkus拆分DB模块后调用数据库遇Hibernate会话异常求助

解决Quarkus拆分数据库模块后"No current Mutiny.Session found"异常的方案

针对你拆分数据库模块后遇到的java.lang.IllegalStateException: No current Mutiny.Session found异常,以下是几个实用的排查和解决方向:

1. 确认独立模块的依赖与配置

  • 确保独立模块中已添加必要的Quarkus反应式数据库依赖:
    <!-- Maven示例 -->
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-hibernate-reactive</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-reactive-pg-client</artifactId>
    </dependency>
    
  • 检查主模块的application.properties中数据库配置(如quarkus.datasource.reactive.url、quarkus.hibernate-orm.database.generation等)是否能被独立模块正确读取,避免因数据源配置缺失导致会话无法创建。

2. 修正@WithSession的使用位置

  • @WithSession需要标注在实际执行数据库操作的方法上(即独立模块的Repository/Service方法),而非仅在主模块的JAX-RS方法上。跨模块调用时,JAX-RS的自动会话上下文无法穿透到子模块的方法层级,比如:
    // 独立模块的Repository类
    @ApplicationScoped
    public class UserRepository implements PanacheRepository<User> {
        // 在此处标注@WithSession,而非仅在主模块的调用方法上
        @WithSession
        public Uni<User> findByEmail(String email) {
            return find("email", email).firstResult();
        }
    }
    

3. 手动管理会话上下文

如果上述注解方式无效,可通过Mutiny.SessionFactory手动包裹数据库操作,确保会话上下文在子模块内生效:

@Inject
Mutiny.SessionFactory sessionFactory;

public Uni<List<User>> listAllUsers() {
    // 用withSession包裹所有数据库操作逻辑
    return sessionFactory.withSession(session -> 
        session.createQuery("SELECT u FROM User u", User.class).list()
    );
}

4. 确保Bean与实体被正确扫描

  • 独立模块需添加空的META-INF/beans.xml文件,或在主模块的application.properties中配置索引依赖,让Quarkus能扫描到子模块的Bean和Hibernate实体:
    quarkus.index-dependency.db-module.group-id=你的模块groupId
    quarkus.index-dependency.db-module.artifact-id=你的模块artifactId
    
  • 确认Hibernate实体类上的@Entity注解被正确识别,避免因实体未被扫描导致会话初始化失败。

5. 检查是否混用反应式与非反应式API

  • 确保独立模块全程使用Mutiny反应式API(如Mutiny.Session、Uni/Multi),禁止混用传统Hibernate的Session或EntityManager,否则会导致会话上下文不兼容。

6. 尝试使用事务注解

如果数据库操作需要事务支持,可替换@WithSession为@WithTransaction,Quarkus会自动创建带事务的会话上下文:

@WithTransaction
public Uni<User> createUser(User user) {
    return persist(user);
}

内容的提问来源于stack exchange,提问作者hicben

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 15:18:10