Использование spel с Hibernate Table и flyway - PullRequest
0 голосов
/ 24 апреля 2020

При наличии такого выражения SPEL в файле application.yml для приложения с весенней загрузкой -

database:
      schema: '#{"${ENV_VAR:}".equals("")?"DEMO":"DEMO_${ENV_VAR:}"}'

Следующее работает в коде и печатает подставленное значение, например DEMO_XYZ / DEMO, если $ {ENV_VAR} = XYZ

@Value("${database.schema}")
private String schema;

Но объект JPA Hibernate с аннотацией таблицы не может принять переменную с поддержкой SPEL здесь в качестве схемы -

@Entity
@Table(name = "TABLE_A", schema="${database.schema}") // prints whole spel expression here 
public class TableA { ...

Даже ниже не может использовать подставленное значение для SPEL, используя значение по умолчанию -schema -

spring:  
  jpa:
    show-sql: true
    properties:
      hibernate:
        default_schema: ${database.schema} // prints whole value here as well

Похоже, что flyway не может использовать переменную SPEL, как это уже определено в application.yml

spring:  
  flyway:
    jdbc-url: ...
    schemas: ${database.schema}

В любом случае для hibernate.default_schema и flyway.schemas принять выражение SPEL как ${database.schema} в том же YML?

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Spring Boot на самом деле не поддерживает SpEL в application.yml.

Если вы введете Environment и

String property = env.getProperty("database.schema");

, вы увидите, что заполнители разрешены, но не SpEL.

@Value должен иметь дополнительный лог c, чтобы разрешить SpEL дальше вниз по течению.

0 голосов
/ 25 апреля 2020

Исправлено: программное создание компонентов Hibernate JPA и компонентов Flyway, как показано ниже, вместо использования YML, поскольку только аннотации @Value могут читать SPEL

database:
      schema: '#{"${ENV_VAR:}".equals("")?"DEMO":"DEMO_${ENV_VAR:}"}'

Конфигурация базы данных


@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.xyz"})
@EntityScan(basePackages = {"com.xyz"})
public class DbConfig
{
    @Value("${database.schema}")
    private String schema; 

    @Bean
    public EntityManager entityManager(SessionFactory sessionFactory)
    {
        return sessionFactory.createEntityManager();
    }

    @Bean
    public PlatformTransactionManager transactionManager()
    {
        return new JpaTransactionManager();
    }

    @Bean
    public HikariConfig hikariConfig()
    {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setDriverClassName("net.client.jdbc.Driverx");
        hikariConfig.setJdbcUrl(url);
        Properties props = new Properties();
        props.put("user", user);
        props.put("password", password);
        props.put("db", db);
        props.put("schema", schema);  // SCHEMA is from SPEL
        hikariConfig.setDataSourceProperties(props);
        return hikariConfig;
    }

    @Bean
    public DataSource dataSource(HikariConfig hikariConfig)
    {
        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean entityManagerFactory(DataSource snowflakeDataSource)
    {
        LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
        localSessionFactoryBean.setDataSource(dataSource);
        localSessionFactoryBean.setPackagesToScan("com.xyz");
        Properties properties = new Properties();
        properties.setProperty("hibernate.default_schema", schema);
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.format_sql", "true");
        localSessionFactoryBean.setHibernateProperties(properties);
        return localSessionFactoryBean;
    }

Flyway Config

    @Value("${database.schema}")
    private String schema;

    @Bean
    public Flyway flyway(DataSource dataSource)
    {
        Flyway flyWay = Flyway.configure()
            .dataSource(dataSource)
            .locations("classpath:/somefolder/migrations")
            .schemas(schema)  // SCHEMA is from SPEL
            .baselineVersion("1.0")
            .sqlMigrationPrefix("V")
            .sqlMigrationSuffixes(".sql")
            .placeholders(Map.of("key1", value1,
                "key2", value2))
            .placeholderReplacement(true)
            .placeholderPrefix("%")
            .placeholderSuffix("%")
            .load();
        flyWay.migrate();
        return flyWay;
    }
...