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

Quarkus 3.0.0.CR2/Hibernate ORM 6中如何用DISCRIMINATOR实现多租户?

在Quarkus中配置Hibernate DISCRIMINATOR多租户策略的问题

我希望在Quarkus中使用DISCRIMINATOR多租户策略。由于Hibernate版本限制,该策略在Quarkus 2.X中无法使用,因此当时通过特定过滤器和拦截器来实现。如今Hibernate已升级,尝试直接使用该策略,但找不到配置Hibernate CurrentTenantIdentifierResolver 的方法。未配置该属性时出现如下报错:

2023-04-18 17:21:24,566 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (vert.x-eventloop-thread-0) HTTP Request to /api/v1/condominiums failed, error id: 23a9a92b-2494-421f-8b9f-884589308e83-1: org.hibernate.HibernateException: SessionFactory configured for multi-tenancy, but no tenant identifier specified
    at org.hibernate.internal.SessionImpl.setUpMultitenancy(SessionImpl.java:276)
    at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:259)
    at org.hibernate.reactive.session.impl.ReactiveSessionImpl.<init>(ReactiveSessionImpl.java:168)
    at org.hibernate.reactive.mutiny.impl.MutinySessionFactoryImpl.lambda$openSession$1(MutinySessionFactoryImpl.java:112)

看起来仅使用@TenantID注解而不配置其他属性时,FastBootEntityManagerFactoryBuilder不会配置CurrentTenantIdentifierResolver。

我尝试通过quarkus.hibernate-orm.unsupported-properties进行临时解决:

quarkus.hibernate-orm.unsupported-properties."hibernate.multiTenancy" = DISCRIMINATOR
quarkus.hibernate-orm.unsupported-properties."hibernate.tenant_identifier_resolver" = com.digicopro.base.multitenancy.TenantIdentifierResolver

新问题是,使用@RequestScope的TenantIdentifierResolver无法访问RoutingContext:

import io.vertx.ext.web.RoutingContext;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
import org.jboss.logging.Logger;

@RequestScoped
public class TenantIdentifierResolver implements CurrentTenantIdentifierResolver {
    private static final Logger LOG = Logger.getLogger(TenantIdentifierResolver.class);
    @Inject
    RoutingContext context;

    @Override
    public String resolveCurrentTenantIdentifier() {
        final String tenantId = context.get(TenantEntity.TENANT_ID_PROPERTY_NAME);
        LOG.debugv("TenantId = {0}", tenantId);
        return tenantId;
    }

    @Override
    public boolean validateExistingCurrentSessions() {
        return true;
    }

}

报错信息为:

java.lang.NullPointerException: Cannot invoke "io.vertx.ext.web.RoutingContext.get(String)" because "this.context" is null.

显然Quarkus CDI与Hibernate配置之间缺少衔接。

请问是否有相关文档或其他实现方式?这是否属于应上报并规划的缺失特性?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:55:27