2016-05-17 127 views
0

我有一个任务来构建包含头和行的文档。 例如包含标题(日期,库存)和行(材料,数量,价格,总和)的股票收益文档。我的问题是我不确定我的班级架构是否正确。代码是在这里(JPA +休眠):JPA两个类之间的关系

@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; ...} 

回答

1

你正在做一个双向映射,你不能结合@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; 
... 
} 
+0

有人指出,这正好解释了他的问题 –