我有一项任务要构建一个包含标题和行的文档。例如,包含标题(日期、库存)和行(材料、数量、价格、总额)的"库存收入"文档。我的问题是,我不确定我班的建筑是否正确。代码在这里(JPA+Hibernate):
@Entity
@Table
public class Document extends BaseEntity {
@Column
@Temporal(TemporalType.DATE)
private Date date;
@Column
@Temporal(TemporalType.DATE)
private Date createDate;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<DocumentRow> rows;
...
}
public class DocumentRow extends BaseEntity {
@ManyToOne(optional = false, cascade = CascadeType.ALL)
private Document document;
@Column(nullable = false, unique = true)
private Integer row;
...
}
@MappedSuperclass
public abstract class BaseEntity implements Serializable {
private static final long serialVersionUID = 8171308450531596347L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; ...}
您正在进行双向映射,并且无法组合@ManyToOne
和@ManyToMany
,尽管您正在应用逻辑,但sql
是不正确的,因为:
@ManyToMany
将产生一个关联表ManyToOne
只是另一个实体上的父实体的外键。
如果DocumentRow
元素可以在两个不同的Document
之间共享,那么您需要一个ManyToMany
关系,这将导致创建一个joinTable,并且如果您想要双向关系,则必须更改DocumentRow
表上的@ManyToOne
:
@ManyToMany
private List<Document> documents;
如果不是这样,并且DocumentRow
只属于一个文档,那么您需要将父类Document
上的映射从@ManyToMany
更改为@OneToMany
,方法如下:
@Entity
@Table
public class Document extends BaseEntity {
@Column
@Temporal(TemporalType.DATE)
private Date date;
@Column
@Temporal(TemporalType.DATE)
private Date createDate;
@OneToMany(mappedBy="document",...)
private Set<DocumentRow> rows;
...
}