如何在 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
继承策略。
例如当我有以下 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
继承策略。