Spring Boot 连 H2 控制台需同时启用 console 并配置 H2 内存数据源,路径为 /h2-console;ID 用 Long + IDENTITY;文件模式用 jdbc:h2:file:~/todo-db;DB_CLOSE_ON_EXIT=FALSE 跨平台保活。

Spring Boot 项目怎么快速连上 H2 控制台
默认不开启,连不上 H2 Console 是新手最常卡住的第一步。关键不是加依赖,而是配对两件事:暴露端点 + 允许浏览器访问。
- 在
application.yml里必须加:spring: h2: console: enabled: true datasource: url: jdbc:h2:mem:todo-db jpa: database-platform: org.hibernate.dialect.H2Dialect -
spring.h2.console.enabled=true单独写没用,它依赖spring.datasource.url指向 H2 内存库(如jdbc:h2:mem:todo-db),否则控制台打不开就报Database not found - H2 控制台路径是
/h2-console,不是/actuator/h2-console—— Spring Boot 2.3+ 默认禁用 Actuator 暴露这个端点,别往 management 路径里找
Entity 里用 @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) 还是 AUTO
选 GenerationType.IDENTITY。H2 的内存模式不支持序列(SEQUENCE),AUTO 在 H2 下实际退化为 IDENTITY,但显式写出来更稳,也避免换数据库时踩坑。
-
@Id字段类型必须是Long或Integer,不能是long基本类型,否则 JPA 初始化失败报IdentifierGenerationException - H2 默认不支持自增列的
INSERT ... SELECT语法,所以别在 Repository 里写带new Todo()的批量插入逻辑,容易触发NULL not allowed for column "ID" - 如果测试时想清库重来,别只删表,加一句
spring.h2.console.settings.trace=true,控制台右上角能看建表语句,确认ID列真带IDENTITY
怎么让 H2 数据重启不丢(开发阶段)
H2 内存库(jdbc:h2:mem:xxx)进程一关数据全没,这不是 bug,是设计如此。要保留,得切文件模式,但别直接改 URL 为 jdbc:h2:./data/todo —— Windows 和 Mac 路径处理不一致,容易连不上。
- 推荐用
jdbc:h2:file:~/todo-db:波浪号~会被 H2 自动展开为用户主目录,跨平台安全 - 必须加
;DB_CLOSE_ON_EXIT=FALSE参数,否则 JVM 退出时 H2 主动删掉整个文件库 - 第一次运行会生成
todo-db.mv.db文件,别手动删它来“清库”,应该用TRUNCATE TABLE todo或在 H2 控制台点 “Run Script” 执行 SQL
POST /todos 返回 400 但没报错信息?检查 Jackson 和字段命名
Spring Boot 2.6+ 默认禁用 spring.jackson.property-naming-strategy,而前端传的 JSON 键名如果是 title、completed,Java 字段却是 taskTitle、isCompleted,Jackson 就静默忽略,导致对象字段全 null,校验失败却没提示。
立即学习“Java免费学习笔记(深入)”;
- 要么统一命名:Java 字段叫
title、completed,加@Column(name = "title")映射数据库列 - 要么显式配置:在
application.yml加spring: jackson: property-naming-strategy: SNAKE_CASE(如果前端用task_title) - 加个全局异常处理器捕获
MethodArgumentNotValidException,至少把BindingResult的错误日志打出来,不然 400 真成黑盒


















