这似乎是一个很常见的情况,但是作为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 字段进行注释。任何帮助都将不胜感激。
Secondary
实体上有两个@Id
字段是有效的吗? - MattR@Id
注释似乎也很好用。非常感谢你的帮助! - dnc253