Ответ 1
Попробуйте вместо этого использовать @MapKey(name = "locale")
.
@MapKeyJoinColumn
используется, когда ваш ключ карты является сущностью, но здесь вы просто используете строчку locale.
Это похоже на довольно распространенный случай, но как новичок JPA, мне трудно понять это. Я использую EclipseLink и PostgreSQL, но это должно относиться только к спецификации JPA.
У меня есть одна таблица PRIMARY
, у которой есть идентификатор, а затем пучок других столбцов. Существует другая таблица 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")},
[email protected](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.
Я попытался добавить упоминаемое имя столбца в аннотацию (я не был уверен, что это даже должно быть), но я получил ту же ошибку.
Как и было предложено, я попытался использовать @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]].
Возможно, я все об этом ошибаюсь, и есть лучший способ аннотировать поле "Карта". Любая помощь будет высоко оценена.
Попробуйте вместо этого использовать @MapKey(name = "locale")
.
@MapKeyJoinColumn
используется, когда ваш ключ карты является сущностью, но здесь вы просто используете строчку locale.
В моем случае это работает с @OneToMany (каскад = CascadeType.PERSIST) @MapKeyColumn (имя = "COLUMN_NAME")
или
Вы можете напрямую попробовать только с @OneToMany (каскад = CascadeType.PERSIST)