带有Spring Boot的Hibernate Envers - 配置

Mil*_*lan 21 spring hibernate jpa hibernate-envers spring-boot

我正在尝试设置Hibernate Envers以使用我的Spring Boot应用程序.

我已经包含了Envers依赖项并添加了@Audited注释,它工作正常,但我无法配置特定的Envers属性,Spring Boot似乎没有接受它们.

具体来说,我试图通过将这些设置为application.properties来为审计表设置不同的数据库模式,但没有运气:

hibernate.envers.default_schema=app_audit
Run Code Online (Sandbox Code Playgroud)

要么

org.hibernate.envers.default_schema=app_audit
Run Code Online (Sandbox Code Playgroud)

要么

spring.jpa.hibernate.envers.default_schema=app_audit
Run Code Online (Sandbox Code Playgroud)

这些都不奏效.有谁知道如何设置这些?

编辑.

正如M. Deinum建议我尝试的那样:

spring.jpa.properties.org.hibernate.envers.default_schema=app_audit
Run Code Online (Sandbox Code Playgroud)

它工作了!

M. *_*num 43

对于默认情况下不可用的所有配置设置,您可以通过为它们添加前缀来指定它们spring.jpa.properties.这些属性将按原样添加到EntityManagerFactory(作为JPA属性).

spring.jpa.properties.org.hibernate.envers.default_schema=app_audit 
Run Code Online (Sandbox Code Playgroud)

将上面的application.properties内容添加到将添加属性,并应配置Hibernate Envers.

Spring Boot 参考指南中也记录了这一点.

链接

  1. 配置JPA属性
  2. Envers属性


Gab*_*uiu 5

查看 HibernateJpaAutoConfiguration 类,我看不到对 envers 属性的任何支持。以下可能不是最佳解决方案,但您可以尝试一下。

为了让 Spring Boot 支持 envers 属性,您必须:

  1. 覆盖 Spring Boot 用于配置 Hibernate 属性的当前 AutoConfiguration 类,因此它将从您的属性文件中读取 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"));
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 排除 Spring Boot 使用的原始 HibernateJpaAutoConfiguration 并将您自己的添加为 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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

对于使用MySQLSpring Boot 的人,建议使用:

spring.jpa.properties.org.hibernate.envers.default_schema=yourAuditSchema 不管用。

改用这个:

spring.jpa.properties.org.hibernate.envers.default_catalog=yourAuditSchema
Run Code Online (Sandbox Code Playgroud)