22

これは十分に一般的なケースのようですが、JPAの初心者として、私はこれを理解するのに苦労しています。EclipseLinkとPostgreSQLを使用していますが、これはJPA仕様のみに関連しているはずです。

IDを持つテーブルが1つPRIMARYあり、次に他の列がたくさんあります。とも呼ばれるテーブルSECONDARYへの外部キーを持つ別のテーブルがあります。このテーブルには、その複合キーとロケールを表すvarcharがあります。PRIMARYIDSECONDARYID

したがって、エンティティには、キーがテーブルのロケール文字列であり、エントリがエンティティPrimaryであるタイプのフィールドが必要です。私のクラスは次のようになります。Map<String, Secondary>SECONDARYSecondarySecondary

@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]].

たぶん私はこれについてすべて間違っているので、マップフィールドに注釈を付けるためのより良い方法があります。どんな助けでも大歓迎です。

4

2 に答える 2

22

@MapKey(name = "locale")代わりに使用してみてください。

@MapKeyJoinColumnマップ キーがエンティティの場合に使用されますが、ここではロケール文字列を使用しているだけです。

于 2012-08-03T05:28:43.803 に答える