我想出了一个解决方案,解决了我的问题。我希望它对其他人有用。
因此,主要问题在于在多租户配置中,在运行时为新客户端创建模式的Hibernate限制。
“Hibernate不支持在多租户环境中自动模式导出。”
我的解决方法(使用Spring)是创建一个新的LocalSessionFactoryBean,该bean配置为不支持多租户。因此,我基本上有两个LocalSessionFactoryBeans。
1. 用于多租户会话的Multi-Tenant LocalSessionFactoryBean
2. 用于使用在spring文件中设置的配置为租户创建模式的非多租户LocalSessionFactoryBean。
Spring配置
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<map>
<entry key="hibernate.dialect" value="${hibernate.dialect}" />
<entry key="hibernate.hbm2ddl.auto" value="NONE" />
<entry key="hibernate.multiTenancy" value="SCHEMA" />
<entry key="hibernate.tenant_identifier_resolver" value="${hibernate.tenant_identifier_resolver}" />
<entry key="hibernate.multi_tenant_connection_provider" value-ref="multiTenantConnectionProvider" />
</map>
</property>
<property name="mappingResources">
<list>
<COMMON SCHEMA MAPPING RESOURCES />
</list>
</property>
</bean>
<bean id="sessionFactorySchemaManager"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<map>
<entry key="hibernate.dialect" value="${hibernate.dialect}" />
<entry key="hibernate.hbm2ddl.auto" value="CREATE" />
<entry key="hibernate.multiTenancy" value="NONE" />
</map>
</property>
<property name="mappingResources">
<list>
<TENANT SPECIFIC SCHEMA MAPPING RESOURCES />
</list>
</property>
</bean>
用于创建模式的代码
public boolean createSchema(final String tenantId) throws SQLException {
boolean result = false;
if(_configuration != null && _dataSource != null) {
final Configuration tenantConfig = _configuration;
Properties props = new Properties();
props.put(Environment.DEFAULT_SCHEMA, tenantId);
tenantConfig.addProperties(props);
Connection connection = DriverManager.getConnection(_dataSource.getUrl(),
_dataSource.getUsername(), _dataSource.getPassword());
connection.createStatement().execute("CREATE SCHEMA " + tenantId + "");
SchemaUpdate schemaUpdate = new SchemaUpdate(tenantConfig);
schemaUpdate.execute(true, true);
connection.createStatement().execute("SET SCHEMA " + tenantId + "");
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;
}
请注意,此代码中的_configuration来自非多租户LocalSessionFactoryBean。