When using @TenantId to perform multitenancy, org.hibernate.cache.spi.QueryKey instances becomes non-serializable, preventing query caching. This is because of the Set<String> enabledFilterNames field, that is returned by org.hibernate.engine.spi.LoadQueryInfluencers#getEnabledFilterNames:
- When enalbedFilters is empty, it returns Collections.emptySet(), which is serializable
- But when multitenancy is enabled, the TenantIdBinder.FILTER_NAME filter is enabled, and getEnabledFilterNames return a Collections.unmodifiableSet( enabledFilters.keySet() ) => the keySet of the HashMap<String,Filter> enabledFilters is not serializable, hence the result of getEnabledFilterNames not being serializable
A copy of the filter keys should be performed to ensure serializability. |