web-dev-qa-db-ja.com

Spring Bootを使用したHibernate Envers-構成

Spring Bootアプリケーションで動作するようにHibernate Enversをセットアップしようとしています。

Envers依存関係を含めて@ Auditedアノテーションを追加しましたが、正常に機能しますが、特定のEnversプロパティを構成できません。SpringBootはそれらを取得しないようです。

具体的には、私はこれらをapplication.propertiesに置くことで監査テーブルに別のdbスキーマを設定しようとしましたが、運がありませんでした:

hibernate.envers.default_schema=app_audit

または

org.hibernate.envers.default_schema=app_audit

または

spring.jpa.hibernate.envers.default_schema=app_audit

これらはどちらも機能しません。誰もがこれらを設定する方法を知っていますか?

編集

M.デイナムが提案したように、私は試しました:

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

そしてそれはうまくいった!

22
Milan

デフォルトでは使用できないすべての構成設定について、spring.jpa.propertiesをプレフィックスとして付けることで指定できます。これらのプロパティは、そのまま[EntityManagerFactory]に追加されます(JPAプロパティとして)。

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

上記をapplication.propertiesに追加すると、プロパティが追加され、Hibernate Enversが構成されます。

これは、Spring Boot リファレンスガイド にも記載されています。

リンク集

  1. JPAプロパティの設定
  2. Enversプロパティ
46
M. Deinum

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

MySQLSpring Bootを使用している場合は、以下を使用することをお勧めします。

spring.jpa.properties.org.hibernate.envers.default_schema=yourAuditSchema 動作しないでしょう。

代わりにこれを使用してください:

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