(解决方法)在实体上使用@ConditionalOnProperty

时间:2017-08-31 09:54:06

标签: java spring hibernate spring-boot entity

我们有一个带有一些数据库实体类的Spring-Boot应用程序。

我们使用 <select> 来确保连接的数据库具有正确的架构。

现在我们正在添加一个可切换以匹配不同环境的功能,NewFeatureService使用ddl-auto: validate进行注释。

到此为止,一切正常。

问题是该功能需要数据库实体。

@ConditionalOnProperty("newfeature.enabled")

@Entity @ConditionalOnProperty("newfeature.enabled") // <--- doesn't work public class NewFeatureEnitity{...} 显然不起作用,但是如果设置了属性,那么告诉Hibernate仅对数据库验证此实体的好方法是什么。

我们不想要的东西:

  • 即使未使用功能,也会在所有数据库中添加此表
  • 有不同的文物

2 个答案:

答案 0 :(得分:1)

只要类/包包含在Hibernate设置中,Hibernate就会将每个@Entity类视为一个实体。 但是,Spring提出了方便(简单)的解决方案,正如你所提到的,你可以使用@ConditionalOnProperty(我假设你正在使用Spring的java配置):

在您的Hibernate配置类中:

@Configuration
......
public class HibernateConfig {

   @Bean
   @ConditionalOnProperty(name = "newfeature.enabled")
   public String newFeaturePackageToScan(){
        return "com.example.so.entity.newfeature";
   }

   @Bean
   public String commonPackageToScan(){
       return "com.example.so.entity.common";
   }

   @Bean
   public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Autowired DataSource dataSource, @Autowired  String[] packagesToScan){
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        Properties jpaProperties = new Properties();

        jpaProperties.put(AvailableSettings.HBM2DDL_AUTO, "validate");
        jpaProperties.put(...); // other properties

        emf.setDataSource(dataSource);
        emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        emf.setJpaProperties(jpaProperties);
        emf.setPackagesToScan(packagesToScan);

        return emf;
   }

...
} 

@Autowired String[] packagesToScan将组合此数组中所有已定义的字符串bean(我假设您没有定义任何其他字符串bean),因此您可以为其他功能添加尽可能多的String bean,您可以检查{{3更多细节。

重点是将commonfeature包与common包分开,方式是common不是父包。

答案 1 :(得分:1)

为了确保它没有受到监督我想提出我的建议作为答案。

它比O.Badr提供的答案更多地使用了spring-boot。

您可以将spring-boot应用程序配置为仅扫描您的核心实体,如下所示:

@SpringBootApplication
@EntityScan("my.application.core")
public class Application {

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

因此,您可以在my.application.features这样的包中提供可选实体(和功能)(可以随意使用除先前指定的基本包之外的任何其他结构)。

@ConditionalOnProperty("newfeature.enabled")
@Configuration
@EntityScan("my.application.features.thefeature")
public class MyFeatureConfiguration {
  /*
  * No Configuration needed for scanning of entities. 
  * Do here whatever else should be configured for this feature.
  */
}