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

引入JpaRepository后H2数据库PRICES表数据为空的问题求助

引入JpaRepository后H2数据库PRICES表数据为空的问题求助

嗨,我帮你梳理下问题出在哪,这几个关键点导致JPA查不到数据:

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

你的Price实体类和数据库PRICES表的列对应有问题:

  • 数据库列是「大写+下划线」命名(比如BRAND_ID、START_DATE、PRIORITY),实体类用小驼峰,但完全漏掉了priority字段(数据库表明确有这个列,实体类里没定义)
  • 主键id没配置自增策略:数据库用了AUTO_INCREMENT,但实体类@Id注解没加@GeneratedValue,JPA识别不了自增主键,查询时会因为主键匹配规则错误找不到数据

2. 依赖版本冲突

你用的是Spring Boot 3.x,但pom里还引入了javax.persistence-api依赖——Spring Boot 3已经全面切换到Jakarta EE API,应该用jakarta.persistence相关包,这个javax的依赖会导致类路径冲突,直接影响JPA正常工作。

3. Spring Boot版本不一致

pom里parent是spring-boot-starter-parent:3.4.3,但properties里又指定spring-boot.version=3.1.5,版本混乱会导致依赖加载异常。


一步步解决问题:

第一步:修正Price实体类

补全缺失字段,配置主键自增,解决映射问题:

package com.test.testcodechallenge;

import jakarta.persistence.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Data
@Entity
@Table(name = "PRICES")
public class Price {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 对应数据库AUTO_INCREMENT自增策略
    private Long id;

    private Long brandId;
    private LocalDateTime startDate;
    private LocalDateTime endDate;
    private Long priceList;
    private Long productId;
    private Long priority; // 补全数据库里存在的PRIORITY列对应的字段
    private BigDecimal price;
    
    @Column(name = "CURR") // 显式指定对应数据库的CURR列
    private String currency;
}

第二步:清理依赖,统一版本

  • 直接删除pom里的javax.persistence-api依赖:spring-boot-starter-data-jpa已经包含了Spring Boot 3所需的Jakarta Persistence API
  • 统一Spring Boot版本:把parent的version改成3.1.5,和properties里的spring-boot.version保持一致,或者直接删掉properties里的spring-boot.version(parent已经定义了版本)

修改后的pom核心部分示例:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.5</version> <!-- 和properties版本统一 -->
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<!-- 删掉下面这个冲突的依赖 -->
<!--
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>javax.persistence-api</artifactId>
    <version>2.2</version>
</dependency>
-->

第三步:配置自动命名策略(可选,更省心)

在application.properties里加一行,让Hibernate自动把小驼峰字段转成「下划线大写」的列名,以后就不用每个字段都加@Column了:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy

第四步:重启测试

重新运行./mvnw spring-boot:run,再访问/prices接口,就能查到4条数据了!


额外小提醒:

Spring Boot 3.x里所有JPA相关注解都要从jakarta.persistence.*导入,别再用javax.persistence.*的包了。

备注:内容来源于stack exchange,提问作者justHelloWorld

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:20:01