J'ai posté ceci sur github mais je le poste également ici.
J'ai trouvé qu'il est possible d'accomplir une configuration de schéma dynamique pour plusieurs schémas dans différents environnements en remplacant la stratégie de nommage physique.
Prenons par exemple deux entités comme celles-ci qui sont configurées pour deux schémas différents -
@Entity
@Table(name="TABLE1", schema="schema1")
public class FooEntity implements Serializable {
...
}
@Entity
@Table(name="TABLE2", schema="schema2")
public class BarEntity implements Serializable {
...
}
Commencez par créer une configuration dans votre fichier application.yml:
multischema:
config:
schema1: FIRSTSCHEMA
schema2: SECONDSCHEMA
Liez-le à un bean ConfigurationProperties
@Component
@ConfigurationProperties("multischema")
public class MultiSchemaConfigurationProperties {
private Map config;
public void setConfig(Map config) {
this.config = config;
}
public Map getConfig() {
return config;
}
}
Créez une stratégie de nommage physique personnalisée qui injecte MultiSchemaConfigurationProperties et étend la stratégie par défaut de Spring Boot pour votre version. Dans ce cas, j'utilise Spring Boot 2.6.4 qui utilise 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;
}
}
Lorsque l'application démarre, Hibernate invoquera la stratégie de nommage physique personnalisée pour appliquer la règle de nommage physique pour votre schéma en utilisant la configuration fournie dans application.yml. https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.data-access.configure-hibernate-naming-strategy
"schema1" dans FooEntity sera remplacé par la valeur "firstschema" et "schema2" dans BarEntity sera remplacé par la valeur "secondschema".