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

