Составление карты ценностей @Lob - PullRequest
5 голосов
/ 23 января 2011

Это часть моей модели:

@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

Любые идеи приветствуются!

Ответы [ 2 ]

5 голосов
/ 23 января 2011

Это определенно ошибка в Hibernate.В спецификации JPA 2.0 четко указано, что @Lob следует применять к значению карты в этом случае:

. Аннотация Lob может использоваться вместе с примечанием Basic или с * 1007.* [100] аннотация, когда значение коллекции элементов имеет базовый тип.
...

[100] Если коллекция элементов является картой, это относится к значению карты.

Очевидные обходные пути включают определение типа столбца с помощью @MapKeyColumn(columnDefinition = "...") или использование @Embeddable в качестве оболочки для значений.

Также эта ошибка, по-видимому, не сообщается, не стесняйтесь сообщать об этом: HibernateJIRA .

0 голосов
/ 04 ноября 2013

Эта ошибка была исправлена ​​в Hibernate 4.2.6

https://hibernate.atlassian.net/browse/HHH-8472

Обходной путь для предыдущих версий:

@MapKeyType(@Type(type = "java.lang.String"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...