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
相关产品推荐
相关产品推荐

