Add multitenancy module: Hibernate 7 @TenantId vs schema-per-tenant (shared pool + search_path, pool per tenant), JWT tenant filter, isolation failure modes on PostgreSQL 17 (Hibernate 7.4.14.Final, Spring Boot 4.1.2)

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017ic4b4VQVEJWetTT1dYzyJ
This commit is contained in:
2026-10-29 05:52:26 +00:00
co-authored by Claude Sonnet 5.5
parent ef2d2aa8ea
commit 98f4ed7411
45 changed files with 1820 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
# javap of the shipped hibernate-core-7.4.14.Final.jar
$ javap -cp hibernate-core-7.4.14.Final.jar org.hibernate.annotations.TenantId
Compiled from "TenantId.java"
public interface org.hibernate.annotations.TenantId extends java.lang.annotation.Annotation {
}
$ javap -cp hibernate-core-7.4.14.Final.jar org.hibernate.context.spi.CurrentTenantIdentifierResolver
Compiled from "CurrentTenantIdentifierResolver.java"
public interface org.hibernate.context.spi.CurrentTenantIdentifierResolver<T> {
public abstract T resolveCurrentTenantIdentifier();
public abstract boolean validateExistingCurrentSessions();
public default boolean isRoot(T);
}
$ javap -cp hibernate-core-7.4.14.Final.jar org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider
Compiled from "MultiTenantConnectionProvider.java"
public interface org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider<T> extends org.hibernate.service.Service, org.hibernate.service.spi.Wrapped {
public abstract java.sql.Connection getAnyConnection() throws java.sql.SQLException;
public abstract void releaseAnyConnection(java.sql.Connection) throws java.sql.SQLException;
public abstract java.sql.Connection getConnection(T) throws java.sql.SQLException;
public default java.sql.Connection getReadOnlyConnection(T) throws java.sql.SQLException;
public abstract void releaseConnection(T, java.sql.Connection) throws java.sql.SQLException;
public default void releaseReadOnlyConnection(T, java.sql.Connection) throws java.sql.SQLException;
public abstract boolean supportsAggressiveRelease();
public default boolean handlesConnectionSchema();
public default boolean handlesConnectionReadOnly();
public default org.hibernate.engine.jdbc.connections.spi.DatabaseConnectionInfo getDatabaseConnectionInfo(org.hibernate.dialect.Dialect);
}
$ javap -cp hibernate-core-7.4.14.Final.jar org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider
Compiled from "AbstractMultiTenantConnectionProvider.java"
public abstract class org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider<T> implements org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider<T> {
public org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider();
protected abstract org.hibernate.engine.jdbc.connections.spi.ConnectionProvider getAnyConnectionProvider();
protected abstract org.hibernate.engine.jdbc.connections.spi.ConnectionProvider selectConnectionProvider(T);
public java.sql.Connection getAnyConnection() throws java.sql.SQLException;
public void releaseAnyConnection(java.sql.Connection) throws java.sql.SQLException;
public java.sql.Connection getConnection(T) throws java.sql.SQLException;
public void releaseConnection(T, java.sql.Connection) throws java.sql.SQLException;
public boolean supportsAggressiveRelease();
public boolean isUnwrappableAs(java.lang.Class<?>);
public <X> X unwrap(java.lang.Class<X>);
}
$ javap -cp hibernate-core-7.4.14.Final.jar org.hibernate.cfg.MultiTenancySettings
Compiled from "MultiTenancySettings.java"
public interface org.hibernate.cfg.MultiTenancySettings {
public static final java.lang.String MULTI_TENANT_CONNECTION_PROVIDER;
public static final java.lang.String MULTI_TENANT_IDENTIFIER_RESOLVER;
public static final java.lang.String TENANT_IDENTIFIER_TO_USE_FOR_ANY_KEY;
public static final java.lang.String MULTI_TENANT_SCHEMA_MAPPER;
public static final java.lang.String MULTI_TENANT_CREDENTIALS_MAPPER;
}
# javap of spring-boot-hibernate-4.1.2.jar
$ javap -cp spring-boot-hibernate-4.1.2.jar org.springframework.boot.hibernate.autoconfigure.HibernatePropertiesCustomizer
Compiled from "HibernatePropertiesCustomizer.java"
public interface org.springframework.boot.hibernate.autoconfigure.HibernatePropertiesCustomizer {
public abstract void customize(java.util.Map<java.lang.String, java.lang.Object>);
}
# does spring-boot-hibernate mention tenants at all? (entries containing 'tenant', case-insensitive)
matching files: 0