Java Spring Boot JPA基本配置优先于应用程序配置
上下文:使用Spring Boot 0.5.0-M7、MySQL和Commons DBCP、Java配置、Java Spring Boot JPA基本配置优先于应用程序配置,java,spring,jpa,spring-boot,Java,Spring,Jpa,Spring Boot,上下文:使用Spring Boot 0.5.0-M7、MySQL和Commons DBCP、Java配置、@EnableAutoConfigurationset 我已经定义了应用程序的DataSourcebean、JpaVendorAdapterbean、LocalContainerEntityManagerFactoryBean和TransactionManagerbean,并使用特定配置来支持DBCP和一些Hibernate设置。在应用程序启动时,数据源肯定会得到尊重(调试确认),但其他be
@EnableAutoConfiguration
set
我已经定义了应用程序的DataSource
bean、JpaVendorAdapter
bean、LocalContainerEntityManagerFactoryBean
和TransactionManager
bean,并使用特定配置来支持DBCP和一些Hibernate设置。在应用程序启动时,数据源
肯定会得到尊重(调试确认),但其他bean会被忽略。这似乎是JpaBaseConfiguration
类的结果,该类由WebMvcConfiguration
及其一个安全过滤器引入。在任何情况下,除其他事项外,问题在于Hibernate设置将hbm2ddl(模式导出)设置为drop create
,这样每当服务器重新启动时,我都会丢失数据
我查看了源代码,发现似乎可以设置环境变量,这些变量将在
JpaBaseConfiguration
中得到尊重,但这似乎无法设置bean来完成相同的工作。我试图排除一些与数据相关的自动配置类,但没有效果。设置非默认数据配置是否还有其他一些我可能缺少的期望?当检测到hibernate(HibernateEntityManager
)时,查看Spring Boot 0.5.0.M7的代码,并且SpringsLocalContainerEntityManagerFactoryBean
hibernate将始终默认配置。您可以通过将某些属性放在application.properties中来重写它们
spring.jpa.hibernate.naming strategy
-将设置使用的命名策略默认值=ImprovedNamingStrategy
。
spring.jpa.hibernate.ddl auto
-将设置hibernate.hbm2ddl.auto default=create drop
可以设置的常规JPA属性
spring.jpa.show sql
-在日志中显示sqlspring.jpa.database platform
-对于hibernate,这是一种方言spring.jpa.database
-使用的数据库(不要与数据库平台一起使用!)spring.jpa.generate ddl
-如果生成ddl,则默认为false(由spring.jpa.hibernate.ddl auto
属性覆盖)spring.jpa.properties
作为前缀,那么它们将被添加到LocalContainertEntityManagerFactoryBean
的jpapProperties
hibernatejpaaautoconfiguration
的包含与任何其他配置无关,它只是由检测到的某些类触发的
@ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class,
EnableTransactionManagement.class, EntityManager.class,
HibernateEntityManager.class })
@ConditionalOnBean(DataSource.class)
@EnableTransactionManagement
感谢@dave syer和@m-deinum的支持。结果是快照构建成功了,M7不尊重我自己的bean,但现在一切正常了。为了子孙后代,我提取了我在应用程序中所做工作的精华,并将其应用到启动JPA示例中。可以找到来源。Dave,如果你认为有更简单的方法,请告诉我。我认为如果你使用快照,你会发现JPA配置中的单个
@bean
可以通过提供自己的快照来覆盖。可能使用M7时,您必须明确排除hibernate自动配置。MySQL的ddl设置应为“无”。你确定你没有使用嵌入式数据库吗?非常确定,我在调试日志中看到与MySQL的连接,我的表有数据,重新启动时它被删除并重新创建(在MySQL Workbench中确认)调试到SchemaExport显示删除创建设置生效。我将尝试创建一个快照,看看行为是否会改变。