Spring Boot 2.0应用为何无法执行schema.sql文件?
嗨,我之前也碰到过一模一样的情况!Spring Boot 2.x在数据库初始化脚本的执行逻辑上确实做了默认行为调整,官方文档里这个点藏得有点深,我来给你理清楚:
核心原因
在Spring Boot 1.5中,只要classpath下存在schema.sql/data.sql,不管你用的是嵌入式数据库(比如H2)还是生产级数据库(比如MySQL),默认都会自动执行这些脚本。但升级到2.0之后,默认策略变了——只有嵌入式数据库才会自动触发脚本执行,非嵌入式数据库需要显式开启这个功能。
具体解决方案
结合你的配置,这里有几个可行的方案:
方案一:全局开启数据库初始化(推荐)
在你的application.properties里添加这行配置,让Spring Boot无论使用什么数据库都执行初始化脚本:spring.datasource.initialization-mode=always如果你只希望在开发测试的嵌入式数据库环境下执行,可以设为
embedded(这也是2.x的默认值),但显然你需要在非嵌入式环境下也生效,所以always更合适。方案二:让Hibernate直接加载脚本
如果你想保持和1.5类似、由Hibernate处理脚本的逻辑,可以添加Hibernate专属配置,指定要加载的脚本路径:spring.jpa.properties.hibernate.hbm2ddl.import_files=classpath:schema.sql这个属性会让Hibernate在启动SessionFactory时加载指定SQL脚本,执行时机和Spring的数据源初始化略有不同,但能达到你要的效果。
额外提醒:脚本命名与数据库平台
如果你的脚本是针对特定数据库的(比如schema-mysql.sql),别忘了设置数据库平台属性,让Spring Boot自动匹配对应脚本:spring.datasource.platform=mysql
最后验证
你的spring.jpa.hibernate.ddl-auto=none配置是没问题的,它只是关闭了Hibernate自动建表的逻辑,不会影响上面设置的脚本执行。
内容的提问来源于stack exchange,提问作者Đorđe Pržulj

