我在使用枚舉類作爲關鍵字的Map上使用正確的hibernate註釋時遇到了問題。這是一個簡化的(而且非常人爲的)例子。什麼是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
}
這裏是東西我目前的註解
@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>();
}
休眠生成以下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試圖定義信(我map key)作爲tinyblob,但它將startLetter定義爲varchar(255),即使它們都是枚舉類型Letter。當我嘗試創建我看到下面的錯誤
BLOB/TEXT column 'letter' used in key specification without a key length
我GOOGLE了這個錯誤的表,看來,MySQL有問題,當您試圖做一個主鍵,這是Hibernate需要的TINYBLOB柱部分使用Thing_letterFrequencies表。所以我寧願按照startLetter的方式將字母映射到varchar(255)。
不幸的是,我一直在使用MapKey註釋一陣子,現在一直無法做到這一點。我也嘗試過@MapKeyManyToMany(targetEntity = Product.class),但沒有成功。任何人都可以告訴我什麼是我的letterCounts地圖正確的註釋,以便休眠將視爲startLetter相同的方式處理letterCounts地圖鍵?
也許你的數據庫有問題。在發佈我的答案(5月16日)之前,我創建了一些測試,並且一切都很順利。 – 2010-05-22 06:36:28