如何使用JPA映射具有本地化产品名称的表?

时间:2011-02-22 12:54:25

标签: java jpa jboss java-ee

我有一个实体产品:

@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说:“如果主键之外的持久字段或属性被用作映射键,那么它应该具有与之关联的唯一性约束。”

所以我想知道我是否可以使用地图吗?

1 个答案:

答案 0 :(得分:1)

Map键在Java中应该是唯一的,并且这反映在JPA中,期望数据库中的唯一键映射到Map的键。 如果您无法保证唯一性,则需要使用其他数据结构或使用其他密钥。

如果可能的话,在你想成为密钥的字段上设置一个唯一的密钥,这应该可以解决你的问题(但你最终可能不得不使用复合密钥,因此Java代码中的Map结构不同例如,您可能有一个mapkey + language_id复合键,它是唯一的。