Spring Boot基于JPA的配置优先于应用程序配置

时间:2014-01-21 06:20:26

标签: java spring jpa spring-boot

上下文:使用Spring Boot 0.5.0-M7,MySQL和Commons DBCP,Java config,@EnableAutoConfiguration设置。

我已经定义了具有特定配置的应用程序的DataSource bean,JpaVendorAdapter bean,LocalContainerEntityManagerFactoryBeanTransactionManager bean,以支持DBCP和一些Hibernate设置。在应用程序启动时,DataSource肯定受到尊重(调试确认),但其他bean被忽略。这似乎是JpaBaseConfiguration类的结果,它由WebMvcConfiguration和其中一个安全过滤器组合而成。在任何情况下,问题都在于Hibernate设置将hbm2ddl(模式导出)设置为drop-create,这样每次服务器重新启动时都会丢失数据。

我仔细查看了源代码,发现似乎有可能设置环境变量,这些变量将在JpaBaseConfiguration中得到尊重,但这似乎无法设置bean来完成同样的工作。我试图排除一些与数据相关的自动配置类无济于事。是否有其他期望设置我可能缺少的非默认数据配置?

2 个答案:

答案 0 :(得分:9)

在检测到hibernate(HibernateEntityManager)时,查看Spring Boot 0.5.0.M7的代码,并且默认情况下将始终配置spring LocalContainerEntityManagerFactoryBean hibernate。您可以通过将它们放在application.properties中来覆盖某些属性。

spring.jpa.hibernate.naming-strategy - 将设置使用的命名策略default = ImprovedNamingStrategyspring.jpa.hibernate.ddl-auto - 将设置hibernate.hbm2ddl.auto default = create-drop。

您可以设置的常规JPA属性

  1. spring.jpa.show-sql - 在日志中显示sql
  2. spring.jpa.database-platform - 对于休眠,这是方言
  3. spring.jpa.database - 使用的数据库(不要与数据库平台一起使用!)。
  4. spring.jpa.generate-ddl - 如果生成ddl,则默认为false(由spring.jpa.hibernate.ddl-auto属性覆盖)
  5. 如果您想要设置一些默认属性,请将它们作为spring.jpa.properties的前缀,然后将它们添加到jpaProperties的{​​{1}}。

    包含LocalContainterEntityManagerFactoryBean与任何其他配置无关,只是由检测到的某些类触发

    HibernateJpaAutoConfiguration

答案 1 :(得分:0)

感谢@ dave-syer和@ m-deinum的投入。事实证明,SNAPSHOT构建没有做到这一点,M7并不尊重我自己的Beans,但现在事情按预期工作了。对于后人,我提取了我在应用程序中所做的精髓,并将其应用于Boot JPA示例。可以找到来源here。戴夫,如果你认为有一个更简单的方法,请告诉我。