Hibernate未执行初始化脚本(schema.sql、data.sql)问题排查
问题排查与解决方案
1. 指定SQL脚本路径
Spring Boot默认扫描src/main/resources/根目录下的schema.sql和data.sql,你将脚本放在resources/sql子目录,必须显式配置路径才能被加载:
spring.sql.init.schema-locations=classpath:sql/schema.sql spring.sql.init.data-locations=classpath:sql/data.sql
2. 验证数据源初始化顺序配置
你已设置spring.jpa.defer-datasource-initialization=true,该配置确保Hibernate完成DDL更新后再执行data.sql,与spring.jpa.hibernate.ddl-auto=update的组合逻辑正确,确认以下配置无冲突:
spring.jpa.defer-datasource-initialization=true spring.jpa.hibernate.ddl-auto=update
3. 开启SQL执行日志排查
控制台无INSERT日志说明脚本未执行或静默失败,添加日志配置查看详细执行过程:
logging.level.org.springframework.jdbc=DEBUG logging.level.org.hibernate.SQL=DEBUG
通过日志可确认脚本是否被加载、执行时是否存在语法或约束冲突。
4. 修正data.sql的条件插入逻辑
确保脚本适配Hibernate生成的表结构,且避免重复执行导致的静默失败:
- 角色表初始化:
INSERT INTO roles (name) SELECT 'USER' WHERE NOT EXISTS (SELECT 1 FROM roles WHERE name = 'USER'); INSERT INTO roles (name) SELECT 'ADMIN' WHERE NOT EXISTS (SELECT 1 FROM roles WHERE name = 'ADMIN');
- 用户表初始化(仅为空时插入):
INSERT INTO users (username, password) VALUES ('user1', '{bcrypt}$2a$10$...') -- 建议使用加密后的密码 WHERE NOT EXISTS (SELECT 1 FROM users);
- 关联表初始化:
-- 给所有用户绑定USER角色 INSERT INTO user_roles (user_id, role_id) SELECT u.id, r.id FROM users u, roles r WHERE r.name = 'USER' ON DUPLICATE KEY UPDATE user_id = u.id; -- MySQL语法,其他数据库替换为对应冲突处理(如PostgreSQL的ON CONFLICT DO NOTHING) -- 给首个用户绑定ADMIN角色 INSERT INTO user_roles (user_id, role_id) SELECT u.id, r.id FROM users u, roles r WHERE u.id = (SELECT MIN(id) FROM users) AND r.name = 'ADMIN' ON DUPLICATE KEY UPDATE user_id = u.id;
5. 排除其他初始化机制冲突
检查项目中是否存在@PostConstruct方法、自定义数据初始化Bean等,此类逻辑可能覆盖data.sql插入的数据,或干扰脚本执行顺序。
内容的提问来源于stack exchange,提问作者Sergey Zolotarev
相关产品推荐
相关产品推荐

