Узнайте, как динамически предоставлять имя схемы 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
или создать новый. Я упомяну необходимые драйверы базы данных в разделах ниже. Как обычно, полный код этой демонстрации будет приведен в конце руководства.
- Давайте создадим несколько сущностей:
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
определяет имя схемы. Нам нужен собственный идентификатор для определения имени схемы из кода. Я решил использовать суффикс, а именно знак$
. Это может быть что угодно, что действует как идентификатор.