我无法获得正确的休眠注释以在以枚举类为键的 Map 上使用。这是一个简化(并且非常人为)的示例。
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
}
这是我目前对事物的注释
@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,但是它将 startLetter 定义为 varchar(255),即使两者都是枚举类型 Letter。当我尝试创建表时,我看到以下错误
BLOB/TEXT column 'letter' used in key specification without a key length
我用谷歌搜索了这个错误,当您尝试将 tinyblob 列作为主键的一部分时,MySql 似乎出现了问题,这是 hibernate 需要对 Thing_letterFrequencies 表执行的操作。所以我宁愿像 startLetter 那样将字母映射到 varchar(255) 。
不幸的是,我已经对 MapKey 注释大惊小怪了一段时间,并且无法完成这项工作。我也试过 @MapKeyManyToMany(targetEntity=Product.class) 没有成功。谁能告诉我 letterCounts 映射的正确注释是什么,以便休眠将 letterCounts 映射键以与 startLetter 相同的方式处理?