Почему атрибут сопоставления JPA не может быть LinkedHashset? - PullRequest
1 голос
/ 13 октября 2010

По мотивам этого вопроса я попытался изменить следующее:

 @ManyToMany(cascade={CascadeType.REMOVE, CascadeType.MERGE})
private Set<Expression> exps = new LinkedHashSet<Expression>();

на:

 @ManyToMany(cascade={CascadeType.REMOVE, CascadeType.MERGE})
    private LinkedHashSet<Expression> exps = new LinkedHashSet<Expression>();

Однако такой шаг приводит к:

Exception [EclipseLink-1] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.DescriptorException

Описание исключения: Атрибут [exps] не объявлен как тип ValueHolderInterface, но его отображение использует косвенное обращение.Отображение: org.eclipse.persistence.mappings.ManyToManyMapping [exps] Дескриптор: RelationalDescriptor (com.mysimpatico.memoplatform.persistence.entities.Meaning -> [DatabaseTable (MEANING)])

Как я должен вJPA2 для достижения желаемого поведения?

Ответы [ 2 ]

3 голосов
/ 13 октября 2010

Только стандартные типы интерфейсов разрешены в качестве типов атрибутов в JPA.Почему вы меняете тип атрибута?В исходном определении базовая коллекция по-прежнему является вашим пользовательским типом.

2 голосов
/ 13 октября 2010

Я полагаю, что EclipseLink позволит вам использовать конкретный тип коллекции, если вы установите fetch на EAGER. Когда отношения ленивы, EclipseLink требует поместить свою собственную ленивую коллекцию вместо значения. EclipseLink определяет ленивый List, Set и Map, но не LinkedHashSet.

Обратите внимание, что спецификация JPA требует использования интерфейса Collection, Set, List или Map, никакие ссылки не допускаются. Если порядок важен, вы должны просто использовать список.

Технически должна быть возможность поддерживать реализацию коллекции с помощью коллекций LAZY, поэтому, пожалуйста, внесите в нее ошибку / расширение.

...