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

使用Java record定义JPA实体加@Id仍报Entity does not have a primary key错误

错误原因
  • 注解作用目标不匹配:你将@Id直接加在record的构造参数上,该注解默认仅保留在构造方法参数层级,而JPA默认只会扫描类字段、Getter方法上的主键注解,无法读取到构造参数上的@Id,因此判断实体没有主键。
  • 旧版JPA规范不支持record类型实体:你使用的javax.persistence属于JPA 2.2及更早版本的包名,该版本规范发布时Java record还未正式推出(record是Java 16的正式特性),对应的JPA实现(如Hibernate 5.x及更低版本)完全不识别record作为实体类的结构,无法正确读取record组件上的注解信息。
  • 访问器命名规则不兼容:record组件的默认访问器方法名和组件名完全一致,比如code对应的访问器是code(),而旧版JPA默认按照getXxx/isXxx规则扫描Getter方法,就算注解配置正确也无法匹配到对应的访问器。
解决方案

如果要使用record作为实体类,需要做如下调整:

  1. 升级到Jakarta Persistence 3.0及以上版本(包名改为jakarta.persistence.*),使用支持record的JPA实现(如Hibernate 6+)
  2. 给主键注解指定作用在生成的访问器方法上,写法如下:
import jakarta.persistence.*;
import java.time.LocalDate;

@Entity
public record Agent (
        @get:Id
        String code,
        String name,
        LocalDate date,
        String workingArea,
        String country,
        String phoneNumber,
        boolean licenseToKill,
        int credits,
        byte[] picture)
      {}

如果你必须使用javax.persistence的旧版本环境,不能使用record作为@Entity类,需要替换为普通Java类,手动编写字段、构造方法、Getter/Setter等逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:09:05