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

JPA Hibernate中子类继承含ID父类却提示需主键?

问题原因与解决方法

为什么会报错?

JPA无法识别父类Base中的持久化字段(包括主键id),因为你没有给Base类添加JPA的继承映射注解。Foo作为@Entity实体类,JPA默认只会扫描自身定义的字段,不会自动继承父类的持久化注解,所以判定Foo没有主键。

解决步骤

给父类Base添加@MappedSuperclass注解,这个注解的作用是告诉JPA:该类是用于实体子类继承的基类,它的字段会被映射到子类对应的数据库表中。

修改后的Base类代码

import jakarta.persistence.*
import java.util.Date

@MappedSuperclass
open class Base(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long = 0,
    @Column var userId: Long? = 0,
    @Column var created: Date = Date(),
    @Column var updated: Date = Date(),
    @Column var currency: String = ""
)

子类Foo代码无需修改

import jakarta.persistence.*

@Entity
@Table(name = "foo")
class Foo(
    @Column var name: String = "",
) : Base()

补充说明

如果你的Base类本身需要作为独立实体对应数据库表,那么可以将@MappedSuperclass替换为@Entity,同时在Base类上添加@Inheritance注解指定继承策略(比如@Inheritance(strategy = InheritanceType.JOINED)或InheritanceType.SINGLE_TABLE),但从你的代码场景来看,Base作为通用基类,使用@MappedSuperclass是更合适的选择。

内容的提问来源于stack exchange,提问作者four-eyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:51:11