Узнайте, как динамически предоставлять имя схемы JPA в приложении Spring Boot на примерах Postgres и MySQL.

Представьте себе несколько объектов, использующих одну и ту же базу данных, но использующих разные схемы. Требование состоит в том, чтобы имя схемы менялось в зависимости от среды развертывания. Например, SCHEMA_DEV, SCHEMA_TEST, SCHEMA_PROD.

Вы можете подумать: «Могу ли я просто получить значение схемы из свойств приложения, используя свойство schema в моем классе сущности?» Например:

@Entity
@Table(name = "Entity1", schema="SCHEMA1_$({env})")

К сожалению, Spring Boot не разрешит значение свойства ”${env}” .

Существует несколько подходов к решению этой проблемы. Например, используя несколько подключений к источникам данных или реализуя мультитенантность Hibernate. Использование этих методов означает, что вам придется выполнять дополнительное кодирование и настройку, что может привести к потенциальным проблемам.

В этом уроке вы увидите простое решение, требующее всего лишь нескольких строк кода. Вы можете применить это решение к любому объекту во время запуска приложения.

Давайте погрузимся!

Настройка проекта

Вы можете использовать существующий проект Spring Boot с spring-boot-starter-data-jpa dependency или создать новый. Я упомяну необходимые драйверы базы данных в разделах ниже. Как обычно, полный код этой демонстрации будет приведен в конце руководства.

  1. Давайте создадим несколько сущностей:

Entity1 использует Schema1:

@Entity
@Table(name = "Entity1", schema="SCHEMA1_$")
public class Entity1 {
// columns, getters, setters ...
}

Entity2 использует Schema2:

@Entity
@Table(name = "Entity2", schema="SCHEMA2_$")
public class Entity2 {
// columns, getters, setters ...
}
  • Свойство schema определяет имя схемы. Нам нужен собственный идентификатор для определения имени схемы из кода. Я решил использовать суффикс, а именно знак $. Это может быть что угодно, что действует как идентификатор.