java - Hibernate映射问题: Multiple Embeddables + ElementCollections

标签 java hibernate jpa

我有一个 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/

相关文章:

java - 文件到 JTable、JTable 到文件

java - 使用标准图像文件格式,适用于所有操作系统

java - junit 测试可以并行运行吗?

java - 有没有办法打包jar依赖项以便在独立环境中运行java类

java - 为什么类要实现 Serializable 接口(interface)?

java - 如何使用 RxJava 并发处理文本行

java - 没有可用于具有名称的 bean 属性的 getter 方法

java - Hibernate 中带有 Hashmap 的 POJO

jpa - Kotlin JPA 实体 ID

java - JPA + MySQL - 数据库生成的列值