使用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作为实体类,需要做如下调整:
- 升级到Jakarta Persistence 3.0及以上版本(包名改为
jakarta.persistence.*),使用支持record的JPA实现(如Hibernate 6+) - 给主键注解指定作用在生成的访问器方法上,写法如下:
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
相关产品推荐
相关产品推荐

