我在Github上发布了这篇文章,现在也在这里转发一下。
我发现通过覆盖物理命名策略,可以实现多个环境中多个模式的动态模式配置。
假设你有两个像这样的实体,它们被配置为两个不同的模式 -
@Entity
@Table(name="TABLE1", schema="schema1")
public class FooEntity implements Serializable {
...
}
@Entity
@Table(name="TABLE2", schema="schema2")
public class BarEntity implements Serializable {
...
}
首先在你的application.yml文件中创建一个配置:
multischema:
config:
schema1: FIRSTSCHEMA
schema2: SECONDSCHEMA
将其绑定到 ConfigurationProperties bean
@Component
@ConfigurationProperties("multischema")
public class MultiSchemaConfigurationProperties {
private Map<String,String> config;
public void setConfig(Map<String,String> config) {
this.config = config;
}
public Map<String,String> getConfig() {
return config;
}
}
创建一个自定义的物理命名策略,该策略注入MultiSchemaConfigurationProperties并扩展您版本的Spring Boot默认设置。在这种情况下,我正在使用Spring Boot 2.6.4,它使用CamelCaseToUnderscoresNamingStrategy。
@Component
public class MultiSchemaPhysicalNamingStrategy extends CamelCaseToUnderscoresNamingStrategy {
private final MultiSchemaConfigurationProperties schemaConfiguration;
public MultiSchemaPhysicalNamingStrategy(MultiSchemaConfigurationProperties schemaConfiguration) {
this.schemaConfiguration = schemaConfiguration;
}
@Override
public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) {
if(name != null) {
Identifier identifier = super.getIdentifier(schemaConfiguration.getConfig()
.get(name.getText()), name.isQuoted(), jdbcEnvironment);
return super.toPhysicalSchemaName(identifier, jdbcEnvironment);
}
return name;
}
}
应用程序启动时,Hibernate将调用自定义物理命名策略,使用application.yml中提供的配置应用物理命名规则来为模式应用命名。 https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.data-access.configure-hibernate-naming-strategy
FooEntity中的"schema1"将被替换为"value firstschema",而BarEntity中的"schema2"将被替换为"value secondschema"。