エンティティがあるとします:
@Entity
public class AnEntity implements Serializable{
@ElementCollection
private List<String> strings = new Vector<String>();
// other stuff
}
私はEclipseLink(JPA 2.0)を使用しています。
このリスト内の文字列は、多くの AnEntity オブジェクトで同じ値を持つ場合があります。つまり、多くの AnEntity オブジェクトが同じ文字列を参照する可能性があります。
問題は、@ElementCollection が提供するデフォルトのマッピングが文字列のテーブル (ANENTITY_STRINGS) に多くの重複を残すことです。文字列のリストを保存するときに値を一意に保存して、重複する文字列の膨大なテーブルがないようにするにはどうすればよいですか?
文字列である単一のメンバーを持つ「プレースホルダー」クラスを使用しようとしたことを追加する必要があります。残念ながら、このようにすると、関連付けられたテーブルのデータが完全に読み取れなくなります。blob または lob として保存されているはずです。したがって、たとえば、リストを使用する代わりに、次のようなことを行いました。
@ElementCollection
@ManyToMany
private List<StringWrapperClass> strings = new Vector<StringWrapperClass>();
そして、私のエンティティは次のようになります。
@Entity
public class StringWrapperClass implements Serializable {
private String string;
// other stuff, getters, setters, id, etc
}
しかし、私が言ったように、それは ANENTITY_STRINGS にちょうどバイトを入れます。これが「正しい」方法だとは想像できません。