次のモデルがあります。タイプ 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 を使用しています。