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

JPA多层继承映射:如何实现单表存储?

解决方案

问题出在你给中间抽象类BaseQuadrangle、BaseTriangle标记了@MappedSuperclass,这会让JPA将它们视为独立的映射超类,而非单表继承体系的一部分,进而生成额外的表。要实现单表存储,需调整如下:

  • 顶层公共超类BaseElement保留@MappedSuperclass,用于抽取所有类的公共属性
  • 单表继承的根实体BaseShape保持原有配置,指定SINGLE_TABLE策略和表名
  • 中间抽象类BaseQuadrangle、BaseTriangle移除@MappedSuperclass,改为标记@Entity(抽象类也可作为JPA实体,纳入继承体系)
  • 具体实体类保持@Entity和@DiscriminatorValue配置,无需额外表定义

正确的映射配置代码

@MappedSuperclass
abstract class BaseElement {
    private String name;
}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "shape_type")
@Table(name = "shape")
abstract class BaseShape extends BaseElement {
    private String attr2;
}

@Entity
abstract class BaseQuadrangle extends BaseShape {
    private String attr3;
    private String attr4;
}

@Entity
@DiscriminatorValue("square")
class Square extends BaseQuadrangle {
    private String attr5;
}

@Entity
@DiscriminatorValue("rectangle")
class Rectangle extends BaseQuadrangle {
    private int attr6;
}

@Entity
abstract class BaseTriangle extends BaseShape {
    private int attr7;
}

@Entity
@DiscriminatorValue("right_triangle")
class RightTriangle extends BaseTriangle {
    private int attr9;
}

@Entity
@DiscriminatorValue("equilateral_triangle")
class EquilateralTriangle extends BaseTriangle {
    private int attr10;
}

这样配置后,JPA会将所有类的属性合并到shape单表中,通过shape_type字段区分不同实体类型,满足你单表存储的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:56:20