У меня проблемы с получением нужных спящих аннотаций для использования на карте с перечисленным классом в качестве ключа. Вот упрощенный (и чрезвычайно надуманный) пример.
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 пытается определить букву (мой ключ карты) как крошечный шарик, однако он определяет startLetter как varchar (255), даже если оба имеют перечислимый тип Letter. Когда я пытаюсь создать таблицы, я вижу следующую ошибку
BLOB/TEXT column 'letter' used in key specification without a key length
Я погуглил эту ошибку, и кажется, что у MySql есть проблемы, когда вы пытаетесь сделать столбец tinyblob частью первичного ключа, а именно это нужно hibernate с таблицей Thing_letterFrequencies. Поэтому я бы предпочел, чтобы письмо было сопоставлено с varchar (255), как startLetter.
К сожалению, я некоторое время возился с аннотацией MapKey и не смог сделать эту работу. Я также попытался @MapKeyManyToMany (targetEntity = Product.class) без успеха. Может кто-нибудь сказать мне, каковы правильные аннотации для моей карты letterCounts, чтобы hibernate обрабатывал ключ карты letterCounts так же, как и startLetter?