{"record":{"id":"cf6bbb8b57935654","repo":"quarkusio/quarkus","slug":"unexpected-multitenancy-strategy","errorCode":null,"errorMessage":"Unexpected multitenancy strategy: ","messagePattern":"Unexpected multitenancy strategy: ","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/DataSourceTenantConnectionResolver.java","lineNumber":59,"sourceCode":"        this.dataSourceName = dataSourceName;\n        this.multiTenancyStrategy = multiTenancyStrategy;\n    }\n\n    @Override\n    public ConnectionProvider resolve(String tenantId) {\n        LOG.debugv(\"resolve((persistenceUnitName={0}, tenantIdentifier={1})\", persistenceUnitName, tenantId);\n        LOG.debugv(\"multitenancy strategy: {0}\", multiTenancyStrategy);\n\n        AgroalDataSource dataSource = tenantDataSource(dataSourceName, tenantId, multiTenancyStrategy);\n        if (dataSource == null) {\n            throw new IllegalStateException(\n                    String.format(Locale.ROOT, \"No instance of datasource found for persistence unit '%1$s' and tenant '%2$s'\",\n                            persistenceUnitName, tenantId));\n        }\n        return switch (multiTenancyStrategy) {\n            case DATABASE -> new QuarkusConnectionProvider(dataSource);\n            case SCHEMA -> new SchemaTenantConnectionProvider(tenantId, dataSource);\n            default -> throw new IllegalStateException(\"Unexpected multitenancy strategy: \" + multiTenancyStrategy);\n        };\n    }\n\n    private static AgroalDataSource tenantDataSource(Optional<String> dataSourceName, String tenantId,\n            MultiTenancyStrategy strategy) {\n        return switch (strategy) {\n            case DATABASE -> Arc.container().instance(AgroalDataSource.class, new DataSource.DataSourceLiteral(tenantId)).get();\n            // The datasource name should always be present when using a multi-tenancy other than DATABASE;\n            // we perform checks in HibernateOrmProcessor during the build.\n            case SCHEMA -> getDataSource(dataSourceName.get());\n            default -> throw new IllegalStateException(\"Unexpected multitenancy strategy: \" + strategy);\n        };\n    }\n\n    private static AgroalDataSource getDataSource(String dataSourceName) {\n        return Arc.container().instance(AgroalDataSource.class, AgroalDataSourceUtil.qualifier(dataSourceName)).get();\n    }\n","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/DataSourceTenantConnectionResolver.java#L41-L77","documentation":"DataSourceTenantConnectionResolver.resolve() handles only the DATABASE and SCHEMA multitenancy strategies; any other MultiTenancyStrategy value (e.g. NONE or DISCRIMINATOR) reaching this resolver is a configuration/programming error and throws IllegalStateException.","triggerScenarios":"The resolver bean is instantiated/invoked while the persistence unit's MultiTenancyStrategy is something other than DATABASE or SCHEMA — e.g. multitenancy enabled inconsistently, a TenantConnectionResolver is registered but the strategy resolved to NONE/DISCRIMINATOR, or strategy enum changes between build and runtime.","commonSituations":"Registering a TenantConnectionResolver while using discriminator-column multitenancy; a custom resolver wired into a PU that isn't configured as multitenant (strategy NONE); custom code constructing the resolver with a stale strategy.","solutions":["Set quarkus.hibernate-orm.multitenant=database or schema to match your TenantConnectionResolver","Remove/don't register a TenantConnectionResolver if you use DISCRIMINATOR strategy (implement TenantIdBinder instead)","Verify only one multitenancy strategy applies per persistence unit and the resolver matches it"],"exampleFix":"// before\n// resolver registered, multitenant not set -> strategy NONE -> throws\n// after (application.properties)\nquarkus.hibernate-orm.multitenant=database","handlingStrategy":"validation","validationCode":"MultiTenancyStrategy s = /* resolved strategy */;\nif (s != MultiTenancyStrategy.DATABASE && s != MultiTenancyStrategy.SCHEMA) {\n    throw new IllegalStateException(\"TenantConnectionResolver requires database/schema strategy, got \" + s);\n}","typeGuard":null,"tryCatchPattern":"try {\n    return resolver.resolve(tenantId);\n} catch (IllegalStateException e) {\n    if (e.getMessage().startsWith(\"Unexpected multitenancy strategy\")) {\n        Log.error(\"Set quarkus.hibernate-orm.multitenant=database|schema\");\n    }\n    throw e;\n}","preventionTips":["Always set quarkus.hibernate-orm.multitenant when registering a TenantConnectionResolver","Use TenantIdBinder for discriminator-based multitenancy, not a connection resolver","Document which strategy each persistence unit uses"],"tags":["multitenancy","hibernate-orm","config"],"backgroundTag":"multitenancy-strategy-mismatch","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}