Я хочу установить значение аннотации в зависимости от «профиля».
Поясню на примере;
@Entity
//PROD
@Table(name = "users", schema = "JDEPRD")
//DEV
//@Table(name = "users", schema = "JDEDEV")
В приведенном выше примере мы видим, что активным «профилем» является PROD, но предположим, что мы хотим использовать профиль DEV, нам нужно будет прокомментировать аннотацию @Table из PROD и раскомментировать аннотацию DEV @Table.
Если бы это было только для одного объекта, это не было бы проблемой, но у меня много объектов с такой ситуацией, поэтому я не верю, что это способ работы с такого рода импровизированными «профилями».
Знаете ли вы, есть ли способ решить эту ситуацию?
Я бы не стал включать информацию о схеме в таблицу, я бы контролировал это с помощью 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, который изменяет определения таблиц. Но это тоже не лучший стиль.