2011-12-26 11 views
0

マッピングされたクラスがあるのでフィルターカーディナリティ1とFilterColumn N.を提示< FilterColumnを第三のテーブルを生成している:JPA OneToManyとManyToOneは---私はフィルターをマッピングしてい

@Entity 
public class Filter implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    private String name; 
    private String caption; 
    @OneToMany(cascade = CascadeType.MERGE, targetEntity = FilterColumn.class) 
    private Set<FilterColumn> columns; 

    // setters and getters 

} 



@Entity 
public class FilterColumn implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private FilterColumnId id; 
    private String caption; 

    // getters and setters 

@Embeddable 
public static class FilterColumnId implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @ManyToOne 
    private Filter filter; 
    @Column 
    private String name; 

    // getters and setters 

} 


} 

しかし、私は、ドロップ作成命令でアプリケーションを起動するときは、次の3つのテーブルが作成されます。私は本当に欲しい フィルターPK(名) FilterColumn PK(FILTER_NAME、名) Filter_FilterColumn PK(filter_filter_name、filterColumn_filter_name、filterColumn_name)

です フィルタPK(名前) Filter_Column PK(名前、フィルタ名)

なぜこの結果が表示されますか?マッピングに何か問題がありますか?私は何を変えるべきですか?

ありがとうございます。

答えて

2

@OneToManyにはmappedByが必要です。それがなければ、マッパーはFilterに関連付けられたエンティティを見つけるためにfiltercolumnテーブルを見ることができることを知らないので、filter_filtercolumnテーブルを生成します。

複合キーを使用してmappedByに移動したことがわかりません。 @EmbeddedIdを使用しているとすれば、それは単にmappedBy = "id"だと思います。

@ManyToOneをそのようなキークラスで使用できますか?それはJPA仕様以上のHibernate拡張ですか?あなたは通常どこかで@MapsIdが必要でしょうか?

0

複合IDのFilterメンバーに@JoinColumnアノテーションを追加してみてください。実際のカラムは、Filterテーブルのidが何であってもかまいません(または、Hibernateにすべてを生成させる場合は名前を付けずにそのまま残してください)。

同様の問題があり、上記を使用して解決したので、これが機能するかどうか教えてください。私の唯一の他のものは@ForeignKey注釈ですが、私は休止状態があなたのために世話をしてくれると思います。私は命名規則に固執したいので、私はただしました。

関連する問題