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
相关产品推荐
相关产品推荐

