带有Spring Boot的Hibernate Envers - 配置

时间:2014-05-05 10:17:21

标签: spring hibernate jpa spring-boot hibernate-envers

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

我已经包含了Envers依赖项并添加了 @Audited 注释,但它运行正常,但我无法配置特定的Envers属性,Spring Boot似乎无法接收它们。< / p>

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

hibernate.envers.default_schema=app_audit

org.hibernate.envers.default_schema=app_audit

spring.jpa.hibernate.envers.default_schema=app_audit

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

修改

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

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

它有效!

4 个答案:

答案 0 :(得分:40)

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

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

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

Spring Boot reference guide中也记录了这一点。

链接

  1. Configure JPA properties
  2. Envers Properties

答案 1 :(得分:4)

通过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"));
       }
    }
    
  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();
        }
    }
    

答案 2 :(得分:1)

对于使用 MySQL Spring Boot 的用户,建议使用:

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

改为使用此:

spring.jpa.properties.org.hibernate.envers.default_catalog=yourAuditSchema

答案 3 :(得分:1)

我使用yaml格式:

spring:
    jpa:
        properties:
          org:
            hibernate:
                format_sql: false
                envers:
                    audit_table_suffix: AUDIT
                    revision_field_name: NRO_ID_REVISAO_AUDITORIA
                    revision_type_field_name: TPO_REVISAO_AUDITORIA