0

I have a task to build a document which contains header and rows. for example Stock income document which contains the header (date, stock) and the rows (material, quantity, price, sum). My problem is that I am not sure that my classs architecture is right. Code is here (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; ...}
4

1 回答 1

1

您正在执行双向映射,并且无法组合@ManyToOneand @ManyToMany,尽管您正在应用逻辑,但sql是不正确的,因为:

@ManyToMany将导致关联表 ManyToOne 只是另一个实体上的父实体的外键。

如果一个DocumentRow元素可以在两个不同的元素之间共享,Document那么您需要一个ManyToMany关系,这将导致创建一个 joinTable 并且如果您想要双向关系,则必须更改@ManyToOneon Table :DocumentRow

@ManyToMany
private List<Document> documents;

如果不是这种情况并且 aDocumentRow只属于一个文档,那么您需要将父类上的映射Document从 from@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;
...
}
于 2016-05-17T11:20:33.037 回答