Spring Boot初始化H2数据库失败,SQL语法异常求助
问题:Spring Boot集成H2数据库初始化数据时触发SQL语法错误
相关代码与配置
JPA实体类
@Entity @Table(name = "addresses") @Getter @Setter @NoArgsConstructor public class AddressEntity { @Id @GeneratedValue private Long id; private String city; private String postalCode; private String street; private String houseNumber; }
Spring Boot配置(application.yml)
spring: h2: console: enabled: true path: /h2 datasource: url: jdbc:h2:mem:/testdB username: sa password: driverClassName: org.h2.Driver jpa: hibernate: ddl-auto: none generate-ddl: true defer-datasource-initialization: true database-platform: org.hibernate.dialect.H2Dialect sql: init: data-locations: - classpath:addresses.sql
初始化数据脚本(addresses.sql)
INSERT INTO ADDRESSES (ID, CITY, POSTAL_CODE, STREET, HOUSE_NUMBER) VALUES (0, 'NYC', '10020', 'Main Street', '32 A');
错误信息
启动应用时抛出org.h2.jdbc.JdbcSQLSyntaxErrorException,具体提示:
expected "DIRECT, SORTED, DEFAULT, VALUES, SET, (, WITH, SELECT, TABLE, VALUES";
已知现象
- 关闭数据初始化时,表可正常创建
- 在H2控制台手动执行该SQL脚本,能成功插入数据
解决方案
1. 修正H2数据库URL格式
当前H2内存数据库URL存在格式错误,mem:后多了一个斜杠。正确的URL应为jdbc:h2:mem:testdB,修改后的数据源配置如下:
spring: datasource: url: jdbc:h2:mem:testdB
2. 排查SQL脚本格式问题
确保addresses.sql文件使用标准LF换行符,避免CRLF格式导致的解析异常;同时检查脚本末尾是否存在多余空行或特殊字符,保证SQL语句的完整性。
3. 调整JPA配置避免冲突
ddl-auto: none已禁用Hibernate的自动DDL生成,而generate-ddl: true是Spring自带的DDL生成逻辑,两者可能存在执行顺序冲突。建议将generate-ddl改为false,确保数据初始化脚本在表创建完成后执行:
spring: jpa: hibernate: ddl-auto: none generate-ddl: false defer-datasource-initialization: true database-platform: org.hibernate.dialect.H2Dialect
内容的提问来源于stack exchange,提问作者Luk
相关产品推荐
相关产品推荐

