Как установить значения аннотации со свойствами

Я хочу установить значение аннотации в зависимости от «профиля».

Поясню на примере;

@Entity
//PROD
@Table(name = "users", schema = "JDEPRD")
//DEV
//@Table(name = "users", schema = "JDEDEV")

В приведенном выше примере мы видим, что активным «профилем» является PROD, но предположим, что мы хотим использовать профиль DEV, нам нужно будет прокомментировать аннотацию @Table из PROD и раскомментировать аннотацию DEV @Table.

Если бы это было только для одного объекта, это не было бы проблемой, но у меня много объектов с такой ситуацией, поэтому я не верю, что это способ работы с такого рода импровизированными «профилями».

Знаете ли вы, есть ли способ решить эту ситуацию?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы не стал включать информацию о схеме в таблицу, я бы контролировал это с помощью application.properties, имеющего несколько свойств на основе профиля.

spring.datasource.url=jdbc:postgresql://localhost:5432/schema-dev

Предоставление времени выполнения вашего активного профиля -Dspring.active.profile=dev

Вы можете использовать https://www.baeldung.com/spring-profiles#3-multi-document-files или даже несколько файлов.

my.prop=used-always-in-all-profiles
#---
spring.config.activate.on-profile=dev
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db
spring.datasource.username=root
spring.datasource.password=root
#---
spring.config.activate.on-profile=production
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

Аннотации — это концепция времени компиляции, а свойства — концепция времени сборки или времени выполнения. Поскольку аннотации, если они настроены таким образом, являются частью файла класса, их невозможно изменить во время выполнения.

Но, возможно, вы можете изменить это с помощью библиотеки, такой как cglib. НО: как сказал Рагху Динка, гораздо лучше использовать две разные базы данных или схемы. Один для разработки и один для производства. И эта манипуляция должна быть сделана до того, как OR-Mapper проанализирует классы.

Другим способом может быть реализация подключаемого модуля компилятора для компилятора java, который изменяет определения таблиц. Но это тоже не лучший стиль.

Другие вопросы по теме