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é!
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
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:
é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"));
}
}
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();
}
}
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