我有一个 LocalizedString
Embeddable,如下所示:
@Embeddable
public class LocalizedString {
@ElementCollection(fetch = FetchType.EAGER)
private Map<String, String> stringMap;
// getter, setter
}
和一个应该使用 LocalizedString 的 Article 类:
@Entity
public class Article {
@Id
@GeneratedValue
private long id;
@Embedded
private LocalizedString title;
@Embedded
private LocalizedString text;
// getter, setter
}
生成表格效果很好,但是当我尝试插入文章时出现以下异常:
Duplicate entry '1-test2' for key 'PRIMARY'
查看数据库结构后,原因很明显。 Hibernate 仅生成一个 article_string_map
表,该表具有对文章 id 和 map 键的主键约束。
谷歌搜索这个问题让我找到了this question on SO以及包含 @AttributeOverride 注释的答案:
@Entity
public class Article {
@Id
@GeneratedValue
private long id;
@AttributeOverride(name="stringMap",column=@Column(name="title_stringMap"))
@Embedded
private LocalizedString title;
@AttributeOverride(name="stringMap",column=@Column(name="text_stringMap"))
@Embedded
private LocalizedString text;
}
但这也不起作用,因为 Hibernate 现在提示这一点:
Repeated column in mapping for collection:
test.model.Article.title.stringMap column: title_string_map
我不明白到底是什么导致了这个错误,而且我无法真正将我发现的有关它的信息转化为我的具体问题。
我的问题是,我还需要修复什么才能使 LocalizedString 作为 Embeddable 工作?我还想知道为什么 Hibernate 说我映射了 title_string_map 两次,尽管我在整个项目中没有提到它两次。是否有某种我需要覆盖的默认映射?
我如何告诉 Hibernate 正确映射它?
(另外,我没有 persistence.xml,因为我纯粹使用注释进行配置)
最佳答案
我自己想出来了。
为了映射 ElementCollection,我必须将 @AssociationOverride
与 joinTable 属性结合使用。工作 Article 类现在如下所示:
@Entity
public class Article {
@Id
@GeneratedValue
private long id;
@AssociationOverride(name = "stringMap", joinTable = @JoinTable(name = "title_stringMap"))
@Embedded
private LocalizedString title;
@AssociationOverride(name = "stringMap", joinTable = @JoinTable(name = "text_stringMap"))
@Embedded
private LocalizedString text;
// getters, setters
}
关于java - Hibernate映射问题: Multiple Embeddables + ElementCollections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30273721/