2

我有一个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

这个问题与我的类似,但我不完全理解为什么我应该使用@EmbeddedId(或者是否有某种方式可以使用@IdClasswith @ManyToOne)。

我在 Hibernate (JBoss 6.1) 上使用 JPA 2.0

有任何想法吗?提前致谢。

4

1 回答 1

7

您正在处理“派生身份”(在 JPA 2.0 规范第 2.4.1 节中描述)。

您需要更改您的 ID 类,以便与“子”实体(在您的情况下gfh)中的“父”实体字段对应的字段具有对应于“父”实体的单个@Id字段(例如String)的类型,或者,如果“父”实体使用IdClass, IdClass(例如Gfh_id)。

Gfh_1i8n中,您应该gfh这样声明:

@Id @ManyToOne
private Gfh gfh = null;

假设GFH有一个@Idtype 字段String,您的 ID 类应如下所示:

public class Gfh_i18n_id implements Serializable {
  private String localeId = null;
  private String gfh = null;
  ...
}
于 2012-12-05T00:31:57.773 回答