2

次のモデルがあります。タイプ A のエンティティは、タイプ (B、C) のエンティティの多くのペアに関連付けられています。各 B エンティティは、A では多くても 1 つのペアで表示されますが、同じ C エンティティが複数のペアで表示される場合があります。例えば:

A1 --> (B1, C1)
   --> (B2, C2)
   --> (B3, C1)

A2 --> (B1, C3)
   --> (B2, C4)
   --> (B3, C4)

これは、A に格納されている java.util.Map<B, C> のセマンティクスに従います。さらに、各 C は 1 つのエンティティ A に対してのみ表示されるため、A と C の関係は OneToMany です。このようなマップを永続化したいと思います。同様の例がJava EE6 docに表示されます。私が知る限り、私のコード (以下) は基本的に例と同じです:

@Entity
public class A implements Serializable {
    @OneToMany(fetch= FetchType.EAGER)
    @JoinTable(name="A_BC_MAP",
            joinColumns=@JoinColumn(name="A_ID"),
            inverseJoinColumns=@JoinColumn(name="C_ID"))
    @MapKeyJoinColumn(name="B_ID")
    private Map<B, C> pinnedCourses = new HashMap<Course, ScheduleTerm>();
    ...
}

A_BC_MAP のデータベース スキーマは、3 列の結合テーブル (A_ID、B_ID、C_ID) を使用して、期待どおりに表示されます。ただし、主キー制約は (A_ID, C_ID) ペアで構成されます。したがって、マップの場合とは異なり、同じ (マップ値) C を持つ複数の (マップ キー) B をデータベースに格納することはできません。

これは予想される動作ですか?マップ セマンティクスの場合、主キーは (A_ID, B_ID) で構成されると予想されます。私は何か間違ったことをしていますか?

現在、EclipseLink 2.3.0 を使用しています。

4

1 に答える 1

0

EclipseLinkを使用してDDLを定義していると思いますか?いつでも独自のDDLスクリプトを使用できます。

OneToManyに重複があるのは珍しいことですが、マップキーを使用するとおそらく可能です。バグをログに記録して、ターゲットの外部キーではなくプライマリキーとしてマップキーを定義するようにDDLで生成することができます。

于 2012-07-31T14:30:58.100 に答える