列挙型クラスをキーとしてマップで使用する適切なHibernateアノテーションを取得するのに問題があります。これは単純化された(そして非常に工夫された)例です。
public class Thing {
public String id;
public Letter startLetter;
public Map<Letter,Double> letterCounts = new HashMap<Letter, Double>();
}
public enum Letter {
A,
B,
C,
D
}
これがThingに関する私の現在の注釈です
@Entity
public class Thing {
@Id
public String id;
@Enumerated(EnumType.STRING)
public Letter startLetter;
@CollectionOfElements
@JoinTable(name = "Thing_letterFrequencies", joinColumns = @JoinColumn(name = "thingId"))
@MapKey(columns = @Column(name = "letter", nullable = false))
@Column(name = "count")
public Map<Letter,Double> letterCounts = new HashMap<Letter, Double>();
}
Hibernateは次のDDLを生成して、MySqlデータベースのテーブルを作成します
create table Thing (id varchar(255) not null, startLetter varchar(255), primary key (id)) type=InnoDB;
create table Thing_letterFrequencies (thingId varchar(255) not null, count double precision, letter tinyblob not null, primary key (thingId, letter)) type=InnoDB;
hibernateはletter(私のマップキー)をtinyblobとして定義しようとしますが、両方とも列挙型Letterであっても、startLetterをvarchar(255)として定義していることに注意してください。テーブルを作成しようとすると、次のエラーが表示されます
BLOB/TEXT column 'letter' used in key specification without a key length
このエラーをグーグルで検索したところ、tinyblob列を主キーの一部にしようとするとMySqlに問題があるようです。これは、休止状態がThing_letterFrequenciesテーブルで行う必要があることです。したがって、startLetterのように、文字をvarchar(255)にマップしたいと思います。
残念ながら、私はしばらくの間MapKeyアノテーションに悩まされていて、これを機能させることができませんでした。@MapKeyManyToMany(targetEntity = Product.class)も試しましたが、成功しませんでした。hibernateがletteCountsマップキーをstartLetterと同じように処理するように、letterCountsマップの正しい注釈を教えてもらえますか?