我有一个 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,因为我纯粹使用注释进行配置)
答案 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
}