Как на карте Картав спящем режиме - PullRequest
0 голосов
/ 18 апреля 2019

В настоящее время я использую Spring Data JPA, и я хотел бы отобразить атрибут

@Entity
public class Outer {
    ...
    Map<String, List<String>> typesToCategories;
}

Предположим, у меня есть таблицы outer и outer_type_category. Первый тривиален: из него релевантен только столбец outer_id

CREATE TABLE outer_types_categories ( 
    id        uuid                        NOT NULL,
    outer_id  uuid                        NOT NULL,
    type      character varying(128)      NOT NULL,
    category  character varying(128)      NOT NULL,
    ...
 )

Какие аннотации мне следует использовать (если это вообще возможно) для сопоставления этой таблицы с картой?

Я пытался использовать это

    @ElementCollection
    @CollectionTable(name = "outer_type_category", joinColumns = [JoinColumn(name = "outer_id")])
    @MapKeyColumn(name = "type")
    @Column(name = "category")
    Map<String, List<String>> typesToCategories;

но в конце я вижу исключение:

Caused by: org.hibernate.MappingException: Could not determine type for: java.util.List, at table: outer_type_category, for columns: [org.hibernate.mapping.Column(category)]

Я что-нибудь забыл?

1 Ответ

0 голосов
/ 18 апреля 2019

JPA указывает, что

Постоянное поле или свойство объекта или встраиваемого класса может соответствуют коллекции базового типа или встраиваемого класса («Коллекция элементов»).

(спецификация JPA 2.2, раздел 2.6; выделение добавлено)

java.util.List не является ни базовым типом, ни встраиваемым классом, поэтому он не входит в число разрешенных типов элементов коллекции элементов. Кроме того, JPA продолжает говорить

Встраиваемый класс [...], содержащийся в элементе коллекция не должна содержать элемент коллекции

, поэтому даже замена List на встраиваемый класс не даст вам подходящего механизма для отображения структуры, которую вы описали. Если вы вообще не хотите или не можете изменить структуру БД, я не думаю, что вы можете сопоставить свою таблицу способом, который каким-либо образом аналогичен тому, что вы описываете.

Если вы, по крайней мере, можете добавить новую таблицу в БД, вы можете ввести новую сущность, представляющую запись на вашей карте, скажем OuterType, в которой коллекция элементов сопоставлена ​​с вашей таблицей outer_types_categories. Вероятно, потребуется составной идентификатор, соответствующий (outer_id, type). Даже в этом случае сторона БД должна быть настроена на автоматическое присвоение значений столбцу id таблицы сбора данных (если только вы не можете удалить этот столбец, что на самом деле не кажется полезным для ваших очевидных целей), поскольку члены коллекции элементов не являются сущностями, и поэтому JPA не присваивает им идентификаторы. Более того, неудобно (на стороне JPA) иметь столбец, который является одновременно частью составного первичного ключа и внешнего ключа для связанной сущности, поскольку для этого потребуется.

Если у вас больше свободы для изменения структуры БД, я бы создал вышеупомянутый объект OuterType со стандартным суррогатным идентификатором и двунаправленным отношением один к одному с Outer, представленным на Outer сторона как карта. Настройте коллекцию элементов, содержащую строки категорий, в OuterType, используя стратегию отображения по умолчанию, которая будет использовать идентификатор (суррогатный) идентификатора OuterType, а не его «тип» или «внешний_идентификатор» в таблице коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...