Hibernate multi-tenancy create schema during runtime

后端 未结 2 1696
野趣味
野趣味 2020-12-29 15:39

I am setting up multi-tenant support for a java web application using hibernate 4 and spring 4. The default schema is created and set when the application starts. This schem

2条回答
  •  -上瘾入骨i
    2020-12-29 16:17

    I came up with a solution that solves my problem. I hope it is useful to someone out there.

    So the main problem came down to the Hibernate restriction of creating a schema for a new client during runtime while in multi-tenant configuration.

    "Hibernate does not support automatic schema export in a multi-tenancy environment."


    My solution to get around this restriction (using Spring) was to create a new LocalSessionFactoryBean that is configured to NOT to support multi-tenancy. So basically I have two LocalSessionFactoryBeans.

    1. Multi-Tenant LocalSessionFactoryBean that is used for multi-tenant sessions
    2. Non Multi-Tenant LocalSessionFactoryBean that is used to create schemas for tenants using the configuration set in the spring file.


    Spring configuration

    
    
        
        
            
                
                
                
                
                
                
            
        
        
            
                
            
        
    
    
    
    
        
        
            
                
                
                
                
            
        
        
            
                
            
        
    
    


    Code used to create the schema

    public boolean createSchema(final String tenantId) throws SQLException {
        boolean result = false;
    
        if(_configuration != null && _dataSource != null) {
    
            // Get a local configuration to configure
            final Configuration tenantConfig = _configuration;
    
            // Set the properties for this configuration
            Properties props = new Properties();
            props.put(Environment.DEFAULT_SCHEMA, tenantId);
            tenantConfig.addProperties(props);
    
            // Get connection
            Connection connection = DriverManager.getConnection(_dataSource.getUrl(), 
                    _dataSource.getUsername(), _dataSource.getPassword());
    
            // Create the schema
            connection.createStatement().execute("CREATE SCHEMA " + tenantId + "");
    
            // Run the schema update from configuration
            SchemaUpdate schemaUpdate = new SchemaUpdate(tenantConfig);
            schemaUpdate.execute(true, true);
    
            // Set the schema
            connection.createStatement().execute("SET SCHEMA " + tenantId + "");
    
            // Set the result
            result = true;
    
        } else if(_configuration == null) {
            if(_LOGGER.isWarnEnabled()) {
                _LOGGER.warn("No configuration was specified for " + getClass().getSimpleName());
            }
        } else if(_dataSource == null) {
            if(_LOGGER.isWarnEnabled()) {
                _LOGGER.warn("No dataSource was specified for " + getClass().getSimpleName());
            }
        }
    
        return result;
    }
    


    Note that the _configuration in this code came from the Non Multi-Tenant LocalSessionFactoryBean

提交回复
热议问题