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

