我有一个Gfh_i18n
实体,带有复合键(@IdClass
):
@Entity @IdClass(es.caib.gesma.petcom.data.entity.id.Gfh_i18n_id.class)
public class Gfh_i18n implements Serializable {
@Id @Column(length=10, nullable = false)
private String localeId = null;
@Id <-- This is the attribute causing issues
private Gfh gfh = null;
....
}
和id类
public class Gfh_i18n_id implements Serializable {
private String localeId = null;
private Gfh gfh = null;
...
}
在撰写本文时,这是可行的。问题是我也有一个
Gfh
类,该类与@OneToMany
有Gfh_i18n
关系:@OneToMany(mappedBy="gfh")
@MapKey(name="localeId")
private Map<String, Gfh_i18n> descriptions = null;
使用Eclipse Dali,这会给我以下错误:
In attribute 'descriptions', the "mapped by" attribute 'gfh' has an invalid mapping type for this relationship.
如果我只是尝试这样做,请使用
Gfh_1i8n
@Id @ManyToOne
private Gfh gfh = null;
它解决了先前的错误,但在
Gfh_i18n
中给出了一个,指出The attribute matching the ID class attribute gfh does not have the correct type es.caib.gesma.petcom.data.entity.Gfh
This question与我的相似,但是我不完全理解为什么我应该使用
@EmbeddedId
(或者是否可以通过@IdClass
使用@ManyToOne
)。我在Hibernate(JBoss 6.1)上使用JPA 2.0
有任何想法吗?提前致谢。
最佳答案
您正在处理“派生身份”(在JPA 2.0规范的2.4.1节中进行了描述)。
您需要更改ID类,以便与“子”实体中的“父”实体字段相对应的字段(在您的情况下为gfh
)具有与“父”实体的单个@Id
字段(例如String
)对应的类型。 ,如果“父”实体使用IdClass
,则为IdClass
(例如Gfh_id
)。
在Gfh_1i8n
中,您应该这样声明gfh
:
@Id @ManyToOne
private Gfh gfh = null;
假设
GFH
具有类型为@Id
的单个String
字段,则您的ID类应如下所示:public class Gfh_i18n_id implements Serializable {
private String localeId = null;
private String gfh = null;
...
}