2016-05-17 163 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

有人指出,這正好解釋了他的問題 –