gpt4 book ai didi

java - Hibernate Multi-Tenancy 在运行时创建模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:39 24 4
gpt4 key购买 nike

我正在使用 hibernate 4 和 spring 4 为 java web 应用程序设置 Multi-Tenancy 支持。默认模式是在应用程序启动时创建和设置的。当不尝试支持 Multi-Tenancy 时,此架构工作正常。

我现在需要做的是为每个创建帐户的新租户创建一个模式。该模式可以简单地是通用模式的副本,因为它将遵循相同的格式。

如何在运行时创建遵循与默认模式相同格式的新模式?默认模式似乎是在实例化 LocalSessionFactoryBean 时创建的,因为这是我指定映射资源的地方。

最佳答案

我想出了一个解决我的问题的方法。我希望它对外面的人有用。

因此,主要问题归结为 Hibernate 在 Multi-Tenancy 配置中在运行时为新客户端创建模式的限制。

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


我解决此限制的解决方案(使用 Spring)是创建一个新的 LocalSessionFactoryBean,它被配置为不支持 Multi-Tenancy 。所以基本上我有两个 LocalSessionFactoryBeans。

  1. 用于 Multi-Tenancy session 的 Multi-Tenancy LocalSessionFactoryBean
  2. 非 Multi-Tenancy LocalSessionFactoryBean,用于使用 spring 文件中的配置集为租户创建模式。


Spring 配置

<!-- Multi-tenant SessionFactory -->
<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" />
<!-- Multi-tenancy support -->
<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>

<!-- SessionFactory capable of managing multi-tenant schemas -->
<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" />
<!-- Multi-tenancy support -->
<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) {

// 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;
}


请注意,此代码中的 _configuration 来自非 Multi-Tenancy LocalSessionFactoryBean

关于java - Hibernate Multi-Tenancy 在运行时创建模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28633759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com