这似乎很普通,但是作为JPA新手,我很难弄清楚这一点。我正在使用EclipseLink和PostgreSQL,但这应该仅与JPA规范有关。

我有一个表PRIMARY,它具有一个ID,然后有一堆其他列。还有另一个表SECONDARY,它在PRIMARY表中也有一个外键,也称为ID。该SECONDARY表具有该ID和代表区域设置的varchar的复合键。

因此,在Primary实体中,我要具有Map<String, Secondary>类型的字段,其中键是SECONDARY表中的语言环境字符串,而条目是Secondary实体。我的Secondary类如下所示:

@Entity
public class Secondary
{
     @Id
     private Long id;
     @Id
     private String locale;
     private String str1;
     private String str2;
     .....
}

我以为我想使用@MapKeyJoinColumn注释,但似乎无法使其他注释起作用。我尝试了这个:
@OneToMany
@JoinColumn(name="ID")
@MapKeyJoinColumn(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;

这导致它试图选择一个不存在的名为secondaryByLocale_key的列。

然后我尝试了这个:
@OneToMany
@JoinTable(name="SECONDARY",
        joinColumns={@JoinColumn(name="ID")},
        inverseJoinColumns=@JoinColumn(name="ID"))
@MapKeyJoinColumn(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;

这将导致以下错误:
Exception Description: The @JoinColumns on the annotated element [field secondaryByLocale] from the entity class [class com.foo.Primary] is incomplete. When the source entity class uses a composite primary key, a @JoinColumn must be specified for each join column using the @JoinColumns. Both the name and the referencedColumnName elements must be specified in each such @JoinColumn.

我尝试将referencedColumnName添加到注释中(我不确定它应该是什么),但是我遇到了同样的错误。

根据建议,我尝试使用@MapKey,如下所示:
@OneToMany
@JoinColumn(name="ID")
@MapKey(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;

这将导致以下错误:
Exception Description: The map key [LOCALE] on the entity class [class com.foo.Secondary] could not be found for the mapping [org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping[secondaryByLocale]].

也许我要解决所有这些错误,并且有一种更好的方法来注释“ map ”字段。任何帮助将非常感激。

最佳答案

尝试改用@MapKey(name = "locale")

当您的 map 关键字是一个实体时,将使用@MapKeyJoinColumn,但此处您仅使用语言环境字符串。

09-27 00:27