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 中的一个错误。JPA 2.0 规范明确指出@Lob在这种情况下应该应用于地图值:

当元素集合值为基本类型时,Lob注解可以与Basic注解结合使用,也可以与[100]注解一起使用。 ...ElementCollection

[100] 如果元素集合是地图,则这适用于地图值。

显而易见的解决方法包括定义列类型,使用@MapKeyColumn(columnDefinition = "...")@Embeddable用作值的包装器。

此外,此错误似乎未报告,请随时报告:Hibernate JIRA

于 2011-01-23T20:06:12.873 回答
1

此错误已在 Hibernate 4.2.6 中修复

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

以前版本的解决方法:

@MapKeyType(@Type(type = "java.lang.String"))
于 2013-11-04T13:42:40.503 回答