2011-01-23 3 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アノテーションを使用。 map "contents"のキーがどのようにデータベースにマップされているかは気にしないことに注意してください。 @Lobアノテーションを地図の値だけに適用するように指定する方法が見つかりませんでした。

Entry.titlesは問題なくデータベースにマップされますが、Entry.contentsは問題ありません。データベーステーブルは作成されず、MySQL/Hibernateは次のように文句を言います:

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のバグです。 JPA 2.0仕様は明らか@Lob、この場合には、マップ値に適用されるべきであると述べている:Lob注釈がBasic注釈 またはElementCollection [100]注釈と共に使用することができる

場合エレメントコレクション値基本タイプは です。
...

[100]要素コレクションがマップの場合、これはマップ値に適用されます。

明白な回避策は@MapKeyColumn(columnDefinition = "...")でカラムタイプを定義または値のラッパーとして@Embeddableを使用することを含みます。

また、このバグは報告されていないようですので、お気軽にご連絡ください:Hibernate JIRA

+1

バグ:http://opensource.atlassian.com/projects/hibernate/ブラウズ/ JPA-11 –

関連する問題