これは十分に一般的なケースのようですが、JPAの初心者として、私はこれを理解するのに苦労しています。EclipseLinkとPostgreSQLを使用していますが、これはJPA仕様のみに関連しているはずです。
IDを持つテーブルが1つPRIMARY
あり、次に他の列がたくさんあります。とも呼ばれるテーブルSECONDARY
への外部キーを持つ別のテーブルがあります。このテーブルには、その複合キーとロケールを表すvarcharがあります。PRIMARY
ID
SECONDARY
ID
したがって、エンティティには、キーがテーブルのロケール文字列であり、エントリがエンティティPrimary
であるタイプのフィールドが必要です。私のクラスは次のようになります。Map<String, Secondary>
SECONDARY
Secondary
Secondary
@Entity
public class Secondary
{
@Id
private Long id;
@Id
private String locale;
private String str1;
private String str2;
.....
}
アノテーションを使いたいと思っています@MapKeyJoinColumn
が、他のアノテーションが動かないようです。私はこれを試しました:
@OneToMany
@JoinColumn(name="ID")
@MapKeyJoinColumn(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;
その結果、存在しないsecondaryByLocale_keyという名前の列を選択しようとしました。
次に、これを試しました。
@OneToMany
@JoinTable(name="SECONDARY",
joinColumns={@JoinColumn(name="ID")},
inverseJoinColumns=@JoinColumn(name="ID"))
@MapKeyJoinColumn(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;
これにより、次のエラーが発生します。
Exception Description: The @JoinColumns on the annotated element [field secondaryByLocale] from the entity class [class com.foo.Primary] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn.
注釈にreferencedColumnNameを追加しようとしましたが(それがどうあるべきかわかりませんでした)、同じエラーが発生しました。
提案されたように、私は@MapKey
次のように使用してみました:
@OneToMany
@JoinColumn(name="ID")
@MapKey(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;
これにより、次のエラーが発生します。
Exception Description: The map key [LOCALE] on the entity class [class com.foo.Secondary] could not be found for the mapping [org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping[secondaryByLocale]].
たぶん私はこれについてすべて間違っているので、マップフィールドに注釈を付けるためのより良い方法があります。どんな助けでも大歓迎です。