如何在 java spring-boot 应用程序中创建抽象 class 和具体 class 之间的实体关系?

How to create an entity relationship between an abstract class and a concrete class in a java spring-boot app?

例如当我有以下 classes

@Getter
@Setter
@NoArgsConstructor
@MappedSuperclass
public class BaseEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    public BaseEntity(Long id) {
        this.id = id;
    }
}

@Getter
@Setter
@NoArgsConstructor
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
//@MappedSuperclass
public abstract class Artwork extends BaseEntity {

    @Column(name = "name")
    private String name;

    @ManyToOne
    @JoinColumn(name = "style_id")
    private Style style;

    //  private ARTIST TODO;

    public Artwork(Long id, String name, Style style) {
        super(id);
        this.name = name;
        this.style = style;
    }

    public abstract int calculateCost();
}

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "styles")
public class Style extends BaseEntity {

    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "artwork")
//    @JoinTable("artwork_id")
    private List<Artwork> artwork;
}

在我的项目中,我会有不同种类的艺术品,每一种都会有一个 Style。所以一开始,我的 Artwork class 是 @MappedSuperClass,但在遇到错误并进行了一些谷歌搜索后,我了解到能够通过 Artwork 定义关系,我必须将其设为 @Entity 并添加 @Inheritance 注释以获得与 @MappedSuperClass 类似的功能(如果我错了请纠正我)。

但现在我仍然得不到我想要的,因为Style中的@JoinTable必须有一个table名字。 那么,有没有办法实现我正在尝试的目标?还是这样做只是一种不好的做法?我是否应该分别指定每个关系(将每个 Artwork 类型作为属性写入 Style 并将关系分配给它们中的每一个)?

TABLE_PER_CLASS 继承策略无法满足您的需求,因为您无法将单个 FK 建模为 SQL 中的多个表。您可以改用 JOINED 继承策略。