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, а не его «тип» или «внешний_идентификатор» в таблице коллекции.