【问题标题】:How to create an entity relationship between an abstract class and a concrete class in a java spring-boot app?java - 如何在java spring-boot应用程序中创建抽象类和具体类之间的实体关系?
【发布时间】:2021-05-17 22:12:13
【问题描述】:

例如当我有以下课程时

@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 类是@MappedSuperClass,但在遇到错误并进行了一些谷歌搜索后,我了解到要能够通过Artwork 定义关系,我必须将其设为@Entity 和添加@Inheritance 注释以获得与@MappedSuperClass 类似的功能(如果我错了,请纠正我)。

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

【问题讨论】:

  • 你能试试单向多对一吗?那就是你删除了 Style 类中的 OneToMany。
  • @g.momo 我可以,但是如果我想保持双向关系,那么单独指定每个关系是唯一的方法吗?
  • 我只是要求您检测问题是否确实存在或其他地方。测试一下。
  • 哦,我明白了。因此,当我删除 Style 中的 OneToMany 行时,它会显示 Basic' attribute type should not be a container

标签: java spring-boot hibernate annotations


【解决方案1】:

TABLE_PER_CLASS 继承策略无法实现您想要的,因为您无法将单个 FK 建模到 SQL 中的多个表。您可以改用JOINED 继承策略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2019-02-27
    相关资源
    最近更新 更多