Open In App

How to Set the Schema Name Dynamically in Spring JPA?

Spring JPA provides a convenient way to save Java objects to relational databases. However, it typically assumes that you have a single schema for your database. If you need to work with multiple schemas, you can use a custom naming strategy to set the schema name dynamically.

Creating a Custom Naming Strategy

To create a custom naming strategy, you need to extend one of the existing naming strategies provided by Spring, such as the CamelCaseToUnderscoresNamingStrategy. In your custom naming strategy, you can override the toPhysicalSchemaName() method to dynamically set the schema name based on your requirements.



Here’s an example of a custom naming strategy that sets the schema name based on an environment variable:




// Java Program for Creating 
// Custom Naming Strategy
package com.geeksforgeeks;
  
// Driver Class
public class DynamicSchemaNamingStrategy extends CamelCaseToUnderscoresNamingStrategy {
  
      // Method for Creating 
    // Custom Naming Strategy 
    @Override
    protected String toPhysicalSchemaName(String identifier) {
        if (identifier.endsWith("$")) {
            String schemaName = System.getenv("SCHEMA_NAME");
            if (schemaName == null) {
                throw new IllegalArgumentException("Environment variable 'SCHEMA_NAME' is not set");
            }
            return identifier.substring(0, identifier.length() - 1) + "." + schemaName;
        } else {
            return identifier;
        }
    }
}

Configuring the Custom Naming Strategy

Once you have created your custom naming strategy, you need to configure it in your Spring Data JPA configuration. You can do this by adding the following code to your application.properties file:



spring.jpa.hibernate.naming-strategy=com.geeksforgeeks.DynamicSchemaNamingStrategy

Replace com.geeksforgeeks.DynamicSchemaNamingStrategy with the fully qualified name of your custom naming strategy class.

Using the Custom Naming Strategy

After you have configured your custom naming strategy, you can use it in your Spring JPA entities. For example, if you have an entity named User and you want to store it in a schema named my_schema, you would annotate the entity as follows to set the name dynamically:

@Entity
@Table(name = "user", schema = "${schema}")
public class User {
private Long id;
private Stirng name;
}

The ${schema} expression will be replaced with the value of the SCHEMA_NAME environment variable at runtime.


Article Tags :