You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:20:16