我正在尝试设置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
它有效!
答案 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 :(得分:4)
通过HibernateJpaAutoConfiguration类,我看不到对envers属性的任何支持。以下可能不是最佳解决方案,但您可以尝试一下。
为了让Spring Boot支持你需要的envers属性:
覆盖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"));
}
}
排除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