2016-05-17 12 views
0

私は、ヘッダと行を含むドキュメントを構築するタスクを持っています。 たとえば、ヘッダ(日付、在庫)および行(品目、数量、価格、合計)を含む在庫収入伝票。私の問題は、私のクラスのアーキテクチャが正しいとは確信していません。コードは(JPA + Hibernateは)ここにある:JPAの2クラス間の関係

@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要素が異なる2 Document間で共有することができるならば、あなたはjoinTableの作成になりますManyToMany関係を必要とし、あなたが双方向の関係をしたい場合はDocumentRow表に@ManyToOneを変更する必要があります。

@ManyToMany 
private List<Document> documents; 

それはそうではないとDocumentRowはただ一つの文書に属している場合、あなたは@ManyToMany@OneToManyからDocumentこの方法で親クラスのマッピング変更する必要があります。

@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

よく指摘されていることは、彼の問題を正確に説明している –