【发布时间】: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