web-dev-qa-db-fra.com

Hibernate Envers avec Spring Boot - configuration

J'essaie de configurer Hibernate Envers pour qu'il fonctionne avec mon application Spring Boot.

J'ai inclus la dépendance Envers et ajouté @Audited annotations et tout fonctionne correctement, mais je ne parviens pas à configurer des propriétés Envers spécifiques, Spring Boot ne semble pas les capter.

Plus précisément, j'ai essayé de définir les différents schémas de base de données pour les tables d'audit en les mettant dans application.properties , mais sans succès:

hibernate.envers.default_schema=app_audit

ou

org.hibernate.envers.default_schema=app_audit

ou

spring.jpa.hibernate.envers.default_schema=app_audit

Ni l'un ni l'autre ne fonctionne. Est-ce que quelqu'un sait comment définir ces?

MODIFIER.

Comme M. Deinum m'a suggéré d'essayer:

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

et cela a fonctionné!

18
Milan

Pour tous les paramètres de configuration qui ne sont pas disponibles par défaut, vous pouvez les spécifier en les préfixant simplement avec spring.jpa.properties. Ces propriétés seront ajoutées telles quelles à la EntityManagerFactory (en tant que propriétés JPA).

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

Ajouter ce qui précède au application.properties ajoutera les propriétés et devrait configurer Hibernate Envers.

Ceci est également documenté dans Spring Boot guide de référence .

Liens

  1. Configurer les propriétés JPA
  2. Envers Properties
39
M. Deinum

En parcourant la classe HibernateJpaAutoConfiguration, je ne vois aucun support pour les propriétés envers. Ce qui suit n'est peut-être pas la meilleure solution, mais vous pouvez néanmoins l'essayer.

Pour que Spring Boot prenne en charge les propriétés envers, vous devez:

  1. écrasera la classe de configuration automatique actuelle utilisée par Spring Boot pour configurer les propriétés Hibernate, afin qu'il lise les propriétés envers de vos fichiers de propriétés. Ceci lira le spring.jpa.hibernate.envers.default_schema from votre fichier et ajoutez-le aux propriétés de 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"));
       }
    }
    
  2. exclut la configuration HibernateJpaAuto d'origine utilisée par Spring Boot et ajoutez votre propre bean afin qu'il soit remplacé:

    @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();
        }
    }
    
4
Gabriel Ruiu

Pour ceux qui utilisent MySQL et Spring Boot , la suggestion d'utiliser:

spring.jpa.properties.org.hibernate.envers.default_schema=yourAuditSchema ne fonctionnera pas.

Utilisez ceci à la place:

spring.jpa.properties.org.hibernate.envers.default_catalog=yourAuditSchema
1
Jack Stuard