Hibernate Envers с настройкой Spring Boot - конфигурация

Я пытаюсь настроить Hibernate Envers для работы с моим приложением Spring для загрузки.

Я включил зависимость Envers и добавил аннотации @Audited, и она отлично работает, но я не могу настроить определенные свойства Envers, Spring Boot, похоже, не забирает их.

В частности, я попытался установить другую схему db для таблиц аудита, поставив их в application.properties, но не повезло:

hibernate.envers.default_schema=app_audit

или

org.hibernate.envers.default_schema=app_audit

или

spring.jpa.hibernate.envers.default_schema=app_audit

Ни одна из этих работ не работает. Кто-нибудь знает, как их установить?

ИЗМЕНИТЬ.

Как предположил М. Дейнус, я попытался:

spring.jpa.properties.org.hibernate.envers.default_schema=app_audit

и это сработало!

Ответы

Ответ 1

Для всех тех параметров конфигурации, которые по умолчанию недоступны, вы можете указать их, просто префикс их с помощью spring.jpa.properties. Эти свойства будут добавлены, как есть, к EntityManagerFactory (как свойства JPA).

spring.jpa.properties.org.hibernate.envers.default_schema=app_audit 

Добавление вышеуказанного в application.properties добавит свойства и должно настроить Hibernate Envers.

Это также описано в справочнике Spring Boot .

Ссылки

Ответ 2

Просматривая класс HibernateJpaAutoConfiguration, я не вижу поддержки свойств envers. Возможно, это не лучшее решение, но тем не менее вы можете попробовать.

Чтобы Spring Boot поддерживал свойства envers, которые вы должны:

  • переопределяет текущий класс AutoConfiguration, который Spring Boot использует для настройки свойств Hibernate, поэтому он будет считывать свойства envers из ваших файлов свойств. Это прочитает spring.jpa.hibernate.envers.default_schema из вашего файла и добавит его в свойства entityManagerFactoryBean:

    @Configuration
    public class HibernateEnversAutoConfiguration extends HibernateJpaAutoConfiguration {
    
       private RelaxedPropertyResolver environment;
    
       public HibernateEnversAutoConfiguration() {
           this.environment = null;
       }
    
       @Override
       public void setEnvironment(Environment environment) {
           super.setEnvironment(environment);
           this.environment = new RelaxedPropertyResolver(environment, "spring.jpa.hibernate.");
       }
    
       @Override
       protected void configure(LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {
           super.configure(entityManagerFactoryBean);
           Map<String, Object> properties = entityManagerFactoryBean.getJpaPropertyMap();
           properties.put("hibernate.envers.default_schema", this.environment.getProperty("envers.default_schema"));
       }
    }
    
  • исключить исходную конфигурацию HibernateJpaAutoConfiguration, которую использует Spring Boot и добавить свой собственный как bean, чтобы она была заменена:

    @EnableAutoConfiguration(exclude = HibernateJpaAutoConfiguration.class)
    @EnableJpaRepositories(basePackages = "com.gabrielruiu.test")
    @EntityScan(basePackages = "com.gabrielruiu.test")
    @ComponentScan(basePackages = "com.gabrielruiu.test")
    @Configuration
    public class Main {
    
        public static void main(String[] args) {
            SpringApplication.run(Main.class, args);
      }
    
        @Bean
        public HibernateEnversAutoConfiguration hibernateEnversAutoConfiguration() {
            return new HibernateEnversAutoConfiguration();
        }
    }