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

Spring Data中CrudRepository无法操作H2数据库求助

排查思路与解决方案

兄弟,我帮你梳理几个大概率的问题点,一个个排查应该能解决:

1. 实体类与数据库表/字段完全不匹配

这是最直观的问题!你的Employee实体和data.sql里的表结构对不上:

  • 实体类标注@Entity后,默认对应表名为employee(小写类名),但你data.sql里建的是TBL_EMPLOYEES表
  • 实体类字段是firstname、lastname,但数据库里是first_name、last_name

解决办法二选一:
要么给实体类加上表名和字段映射:

@Entity
@Table(name = "TBL_EMPLOYEES") // 指定对应数据库表名
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "first_name") // 指定对应数据库字段
    private String firstname;
    
    @Column(name = "last_name")
    private String lastname;
    
    @Column(name = "email")
    private String email;
    
    // 构造器、getter/setter...
}

要么修改data.sql里的表和字段名,和实体类保持一致:

DROP TABLE IF EXISTS EMPLOYEE;
CREATE TABLE EMPLOYEE (id INT AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(250) NOT NULL, lastname VARCHAR(250) NOT NULL, email VARCHAR(250) DEFAULT NULL);
INSERT INTO EMPLOYEE (firstname, lastname, email) VALUES ('Lokesh', 'Gupta', 'abc@gmail.com'), ('Caption', 'America', 'cap@marvel.com');

2. 确认Hibernate自动建表逻辑是否覆盖了预填充数据

Spring Boot默认会让Hibernate根据实体类自动生成表结构(取决于spring.jpa.hibernate.ddl-auto配置,默认是create-drop或update)。如果Hibernate在data.sql执行后才建表,你预填充的数据会被直接清空。

在application.properties里加上这些配置:

# 禁用Hibernate自动建表,用data.sql里的表结构
spring.jpa.hibernate.ddl-auto=none
# 确保每次启动都执行data.sql脚本
spring.sql.init.mode=always
# 避免脚本执行时因表已存在报错
spring.sql.init.continue-on-error=true

3. 确认应用和H2控制台连接的是同一个数据库

你用的是文件型H2数据库,路径是jdbc:h2:file:./fileOrDbName,一定要保证H2控制台的连接URL和这个完全一致!
打开H2控制台时,JDBC URL必须填jdbc:h2:file:./fileOrDbName,而不是默认的内存库(比如jdbc:h2:mem:testdb),否则你在控制台看到的是另一个数据库,和应用连接的不是同一个。

4. 修正接口返回逻辑(方便验证结果)

你的getAllEmployees接口是void返回,只把数据打印到控制台,前端根本看不到结果!就算数据库有数据,你也没法通过接口感知到。修改成这样:

// Controller层
@GetMapping("/getAllEmployees")
public List<Employee> getAllEmployees(){
    return employeeServices.getAllEmployees();
}

// Service层
public List<Employee> getAllEmployees(){
    List<Employee> listOfEmployees = new ArrayList<>();
    employeeRepository.findAll().forEach(listOfEmployees::add);
    System.out.println(listOfEmployees); // 保留打印方便调试
    return listOfEmployees;
}

5. 开启SQL日志,排查执行细节

在application.properties里加上日志配置,打印Hibernate执行的SQL语句,就能直观看到查询的表、字段是否正确:

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

启动应用后调用接口,看控制台输出的SQL,就能快速定位问题。


内容的提问来源于stack exchange,提问作者Tloz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:08:12