2011-01-23 187 views
4

這是我的模型的一部分:映射一個@Lob值映射

@Entity 
public class Entry 
{ 
    @Id @GeneratedValue 
    private long identifier; 

    @ElementCollection 
    @Column(nullable = false) 
    private Map<String, String> titles; 

    @ElementCollection 
    @Column(nullable = false) 
    @Lob 
    private Map<String, String> contents; 

    // Getters and setters, other fields and methods 
} 

我使用@Lob註解,因爲地圖「內容」的值可能很大。請注意,我不關心地圖「內容」的關鍵點如何映射到數據庫。我只是找不到一種方法來指定@Lob註釋只應用於地圖的值。

儘管Entry.titles映射到數據庫沒有問題,但Entry.contents不是。沒有數據庫表創建和MySQL /休眠抱怨:

Unsuccessful: create table myblog.Entry_contents (Entry_identifier bigint not null, contents longtext not null, contents_KEY longtext, primary key (Entry_identifier, contents_KEY)) type=InnoDB 
BLOB/TEXT column 'contents_KEY' used in key specification without a key length 

任何想法,讚賞!

回答

5

這絕對是Hibernate中的一個bug。 JPA 2.0規範中明確指出@Lob應在這種情況下被應用到地圖值:

Lob註釋可以結合Basic註釋 或與ElementCollection [100]註釋可以當元素集合值是基本的 類型。
...

[100]如果元素集合是一個Map,這適用於地圖值。

明顯的解決方法包括定義列類型爲@MapKeyColumn(columnDefinition = "...")或使用@Embeddable作爲值的包裝。

此外這個bug似乎沒有報道,隨時報告:Hibernate JIRA

+1

錯誤創建:http://opensource.atlassian.com/projects/hibernate/瀏覽/ JPA-11 – 2011-01-24 04:52:01