我有一个实体产品:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "product")
@MapKeyColumn(name="locale")
public Map<String,ProductNames> getProductNames() {
return this.productNames;
}
和名为productNames的实体,其中包含产品的本地化版本
private int id;
private SkiProduct skiProduct;
private String locale;
private String text;
我尝试了@MapKeyColumn
和@MapKey
注释。
生成的SQL如下所示:
select
productnam0_.product_id as product4_1_,
productnam0_.id as id1_,
productnam0_.mapkey as mapkey1_,
productnam0_.id as id231_0_,
productnam0_.locale as locale231_0_,
productnam0_.product_id as product4_231_0_,
productnam0_.text as text231_0_
from
product_names productnam0_
我的问题是如何正确配置此映射。 SQL语句中的mapkey列导致SQL-Errormsg,因为它不在db-table中。
Type (ROW(id integer, locale char(2), text varchar(255), product_id integer)) not found.
编辑:Javadoc说:“如果主键之外的持久字段或属性被用作映射键,那么它应该具有与之关联的唯一性约束。”
所以我想知道我是否可以使用地图吗?
答案 0 :(得分:1)
Map键在Java中应该是唯一的,并且这反映在JPA中,期望数据库中的唯一键映射到Map的键。 如果您无法保证唯一性,则需要使用其他数据结构或使用其他密钥。
如果可能的话,在你想成为密钥的字段上设置一个唯一的密钥,这应该可以解决你的问题(但你最终可能不得不使用复合密钥,因此Java代码中的Map结构不同例如,您可能有一个mapkey + language_id复合键,它是唯一的。