6

これは私のモデルの一部です:

@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/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

どんなアイデアでも大歓迎です!

4

2 に答える 2

6

これは間違いなくHibernateのバグです。@LobJPA 2.0仕様では、この場合、マップ値に適用する必要があることが明確に示されています。

注釈は、要素コレクション値が基本タイプの場合、注釈と組み合わせて使用​​することも、[100]注釈とLob組み合わせて使用​​することもできますBasic。 ..。ElementCollection

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

@MapKeyColumn(columnDefinition = "...")明らかな回避策には、値のラッパーを使用して、または値のラッパーとして使用して列タイプを定義することが含ま@Embeddableれます。

また、このバグは報告されていないようです。お気軽に報告してください:HibernateJIRA

于 2011-01-23T20:06:12.873 に答える