未启用datagen profile时H2数据库未创建horse表两列求助
问题排查与解决方案
可能原因及对应解决步骤
1. 建表脚本仅在datagen profile下加载
- 检查脚本存放路径:如果建表SQL放在
src/main/resources/datagen这类profile专属目录,默认profile启动时不会加载该脚本。- 解决:将脚本移至
src/main/resources通用目录,或者在application.properties中配置默认profile加载该脚本:spring.sql.init.location=classpath:/datagen/your-script.sql
- 解决:将脚本移至
- 检查脚本执行配置:确认默认profile的
application.properties中是否开启SQL初始化:
如果只有spring.sql.init.mode=always spring.sql.init.platform=h2application-datagen.properties里配置了上述参数,默认profile不会执行脚本。
2. JPA自动建表覆盖手动脚本
- 查看
spring.jpa.hibernate.ddl-auto配置:如果值为create/update,Hibernate会根据实体类生成表结构。此时需确认Horse实体类是否包含parent1/parent2对应的关联字段:- 如果实体类中这两个字段被
@Profile("datagen")修饰,或者仅在datagen profile下才启用关联配置,默认profile下Hibernate生成的表就会缺少这两列。 - 解决:要么移除字段上的
@Profile注解,确保默认profile下实体类包含这两个字段;要么将spring.jpa.hibernate.ddl-auto设置为none,完全依赖手动建表脚本,避免Hibernate自动修改表结构。
- 如果实体类中这两个字段被
3. 脚本执行顺序冲突
- 如果手动脚本和Hibernate自动建表同时执行,Hibernate的
create模式会先删除旧表再新建,导致手动添加的列被覆盖。- 解决:调整
spring.jpa.hibernate.ddl-auto为validate或none,让Hibernate仅验证表结构而非修改,确保手动脚本的表结构生效。
- 解决:调整
验证脚本执行状态
- 启动应用时查看日志,确认是否有类似
Executing SQL script from class path resource [xxx.sql]的记录。如果没有,说明脚本未被加载,需调整初始化配置。
内容的提问来源于stack exchange,提问作者Péter Békési
相关产品推荐
相关产品推荐

