package org.hibernate.brmeyer.demo; import java.util.Properties; import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; public class SimpleMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { public static final String TENANT_ID_1 = "foo1"; public static final String TENANT_ID_2 = "foo2"; public static final String DB_NAME_1 = "foo1_tbl"; public static final String DB_NAME_2 = "foo2_tbl"; private static final String DRIVER = "org.h2.Driver"; private static final String URL = "jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;MVCC=TRUE"; private static final String USER = "sa"; private static final String PASS = ""; private final ConnectionProvider foo1ConnectionProvider = buildConnectionProvider( DB_NAME_1 ); private final ConnectionProvider foo2ConnectionProvider = buildConnectionProvider( DB_NAME_2 ); @Override protected ConnectionProvider getAnyConnectionProvider() { return foo1ConnectionProvider; } @Override protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { if ( TENANT_ID_1.equals( tenantIdentifier ) ) { return foo1ConnectionProvider; } else if ( TENANT_ID_2.equals( tenantIdentifier ) ) { return foo2ConnectionProvider; } throw new IllegalArgumentException( "Unknown tenant identifier" ); } private ConnectionProvider buildConnectionProvider(String dbName) { Properties props = new Properties( null ); props.put( "hibernate.connection.driver_class", DRIVER ); // Inject dbName into connection url string. props.put( "hibernate.connection.url", String.format( URL, dbName ) ); props.put( "hibernate.connection.username", USER ); props.put( "hibernate.connection.password", PASS ); // Note that DriverManagerConnectionProviderImpl is an internal class. However, rather than creating // a ConnectionProvider, I'm using it for simplicity's sake. // DriverManagerConnectionProviderImpl obtains a Connection through the JDBC Driver#connect DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl(); connectionProvider.configure( props ); return connectionProvider; } }