Установка @Table во время выполнения Spring - PullRequest
0 голосов
/ 23 мая 2018

Я пишу сервис Spring для подключения к моему серверу PostgreSQL SQL с использованием JPA.Проблема, с которой я сталкиваюсь, заключается в том, чтобы установить значение @Table во время выполнения.У меня есть две таблицы, одна для QA и другая для продукта.Поэтому, когда я выполняю jar, я устанавливаю профиль в QA или prod, но я не могу понять, как установить @Table в соответствующую таблицу для данного профиля.

java -jar -Dspring.config.location=.\vmconfig -Dspring.profiles.active=qa postgre-1.0.1.jar

Properties File

server.port= 6869   
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://xxx-xxx/DB
spring.datasource.username=postgres
spring.datasource.password=xxxx
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none

@ Table (name = <>) -> Имя должно быть установлено во время выполнения на основе профиля, в котором выполняется jar.

1 Ответ

0 голосов
/ 23 мая 2018

У вас есть три варианта:

orm.xml (рекомендуется)

Вы можете определить orm.xml.С его помощью вы можете переопределить имя таблицы сущности.Обычно вы бы поместили файл orm.xml в папку resources / META-INF.Но тогда это будет применяться ко всем вашим профилям, так как Spring Boot загрузит его автоматически.

Для вашего случая вы хотите это только для указанного профиля.Для этого вам нужно создать LocalContainerEntityManagerFactoryBean.(Вместо того, чтобы просто устанавливать свойства) ( Пример здесь )

На LocalContainerEntityManagerFactoryBean вы можете затем указать местоположение для orm.xml.

Например:

@Bean
@Profile("QA")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
        DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
    LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
    bean.setDataSource(dataSource);
    bean.setJpaVendorAdapter(jpaVendorAdapter);
    bean.setPackagesToScan("com.example.demo");
    bean.setMappingResources("orm.xml");
    return bean;
}

Эта конфигурация должна применяться только к необходимому профилю.

Вот простой пример orm.xml

<entity-mappings version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm
http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd">

<entity class="com.example.demo.EntityName">
    <table name="NEW_TABLE_NAME"></table>
</entity>

* Спасибо @BillFrost за указание на это.

@ EntityScan для среды

Вы можете указать различные @EntityScan для конфигурации среды.Таким образом, сканируйте только объекты QA в конфигурации QAC.Для этого необходимо создать дубликаты сущностей с разными именами, определенными в @Table.

Мне действительно это не нравится, так как вам приходится поддерживать набор сущностей QA и производственный набор. Это просто производственная проблема, ожидающая возникновения.

Переопределение SpringPhysicalNamingStrategy

Наконец, вы можете расширить SpringPhysicalNamingStrategy, после чего вы можете изменить это имя конкретной таблицы.Этот компонент должен быть активным только в профиле QA.

@Bean
public SpringPhysicalNamingStrategy springPhysicalNamingStrategy() {
    return new SpringPhysicalNamingStrategy() {
        @Override
        public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
            // Just change find and replace your table name
            return super.toPhysicalTableName(new Identifier( name.getText(), false), jdbcEnvironment);
        }
    };
}

** ТАКЖЕ: Просто проверьте, как создать Identifier для требований к именованию вашей БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...