JPA - @OneToMany作为地图

时间:2012-08-03 05:14:46

标签: java jpa map one-to-many

这似乎是一个常见的案例,但作为JPA的新手,我很难搞清楚这一点。我正在使用EclipseLink和PostgreSQL,但这应该只涉及JPA规范。

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

因此,在Primary实体中,我想要一个类型为Map<String, Secondary>的字段,其中键是SECONDARY表中的语言环境字符串,条目是{{1} } 实体。我的Secondary课程如下:

Secondary

我想我想使用@Entity public class Secondary { @Id private Long id; @Id private String locale; private String str1; private String str2; ..... } 注释,但我似乎无法使其他注释工作。我试过这个:

@MapKeyJoinColumn

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

然后我尝试了这个:

@OneToMany
@JoinColumn(name="ID")
@MapKeyJoinColumn(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;

这会导致以下错误:

@OneToMany
@JoinTable(name="SECONDARY", 
        joinColumns={@JoinColumn(name="ID")},
        inverseJoinColumns=@JoinColumn(name="ID"))
@MapKeyJoinColumn(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;

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

根据建议,我尝试使用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. ,如下所示:

@MapKey

这会导致以下错误:

@OneToMany
@JoinColumn(name="ID")
@MapKey(name="LOCALE")
private Map<String, Secondary> secondaryByLocale;

也许我认为这一切都错了,并且有更好的方法来注释Map字段。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:14)

请尝试使用@MapKey(name = "locale")

当您的地图关键字是一个实体时,会使用

@MapKeyJoinColumn,但在这里您只使用区域设置字符串。

答案 1 :(得分:0)

就我而言,它与 @OneToMany(cascade = CascadeType.PERSIST) @MapKeyColumn(name =“ COLUMN_NAME”)

您只能直接尝试 @OneToMany(cascade = CascadeType.PERSIST)

相关问题