Hibernate映射问题:多个Embeddables + ElementCollections

时间:2015-05-16 08:56:20

标签: java hibernate jpa

我有一个 var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.MapQuest({layer: 'sat'}) }) ], view: new ol.View({ center: ol.proj.transform([37.41, 8.82], 'EPSG:4326', 'EPSG:3857'), zoom: 4 }) }); map.on("click", function(evt) { var coord = ol.proj.transform(evt.coordinate, 'EPSG:3857', 'EPSG:4326'); var lon = coord[0]; var lat = coord[1]; alert(lon); alert(lat); }); 嵌入式,如下所示:

LocalizedString

和一个应该使用LocalizedString的Article类:

@Embeddable
public class LocalizedString {

    @ElementCollection(fetch = FetchType.EAGER)
    private Map<String, String> stringMap;

    // getter, setter
}

生成表格很好,但是当我尝试插入文章时,我得到以下异常:

@Entity
public class Article {

    @Id
    @GeneratedValue
    private long id;

    @Embedded
    private LocalizedString title;

    @Embedded
    private LocalizedString text;

    // getter, setter
}

在查看数据库结构后,显而易见的原因。 Hibernate只生成了一个Duplicate entry '1-test2' for key 'PRIMARY' 表,其中主键约束超过了文章ID和地图的键。

谷歌搜索此问题导致我this question on SO以及包含@AttributeOverride注释的答案:

article_string_map

这不起作用,因为Hibernate现在抱怨这个:

@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;
}

我不明白究竟是什么导致了这个错误,我无法真正将我发现的事情转化为我的具体问题。

我的问题是,我还需要解决哪些问题才能使LocalizedString作为Embeddable工作?我也想知道为什么Hibernate说我将title_string_map映射了两次,尽管我在整个项目中都没有提到它两次。是否存在某种我需要覆盖的默认映射?

如何告诉Hibernate正确映射?

(另外,我没有persistence.xml,因为我纯粹使用注释进行配置)

1 个答案:

答案 0 :(得分:0)

我自己想出来了。

为了映射ElementCollection,我必须结合joinTable属性使用@AssociationOverride。工作的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
}