Как обрабатывать аннотации JPA для указателя на универсальный интерфейс - PullRequest
8 голосов
/ 11 мая 2010

У меня есть универсальный класс, который также является сопоставленным суперклассом, который имеет закрытое поле, которое содержит указатель на другой объект того же типа:

@MappedSuperclass
public abstract class MyClass<T extends MyIfc<T>>
    implements MyIfc<T>
    {

        @OneToOne()
        @JoinColumn(name = "previous", nullable = true)
        private T previous;

             ...
             }

Моя проблема заключается в том, что Eclipse показывает ошибку в файле в OneToOne "Target Entity" T ", поскольку предыдущий не является Entity." Все реализации MyIfc, по сути, являются сущностями. Я также должен добавить, что каждая конкретная реализация, которая наследуется от MyClass, использует различное значение для T (потому что T является самим собой), поэтому я не могу использовать атрибут targetEntity.

Полагаю, что если ответа нет, мне придется перенести эту аннотацию JPA на все конкретные подклассы MyClass. Просто кажется как JPA / Hibernate должен быть достаточно умным, чтобы знать, что все это сработает во время выполнения. Заставляет меня задуматься, стоит ли мне как-то игнорировать эту ошибку.

Ответы [ 3 ]

8 голосов
/ 11 мая 2010

Моя проблема в том, что Eclipse показывает ошибку в файле на OneToOne "Target Entity" T ", так как предыдущий не является Entity."

Да, и даже если T расширяет Entity, I не знает ни о каком поставщике JPA, поддерживающем это (это все равно не является частью спецификации JPA). Для получения дополнительной информации просмотрите JPA. Общие классы сущностей Mappedsuperclass невозможны! (очень похожая тема о EclipseLink):

Нет, вы не сможете сделать сущности общими. Поставщик не сможет сопоставить отношение с конкретным типом, определенным универсальным определением, поскольку этот тип назначается, когда объект создается в коде, а не там, где объект определен. Помните, что при определении Generics коллекция (в данном случае) ограничивается только этими типами. Поставщик не может быть таким ограничением для каждого экземпляра сущности. В некоторых случаях изменение типа может привести к отображению совершенно разных таблиц для одного экземпляра Entity, и это определенно не поддерживается.

2 голосов
/ 11 мая 2010

Поскольку JDO поддерживает постоянство полей интерфейса (что аналогично тому, что у вас здесь), а поскольку DataNucleus JPA построен поверх возможностей JDO, то он, вероятно, позволит вам сохранить такое поле (у меня есть пример, использующий JDO, который делает нечто очень похожее, но не видя остатков ваших классов и кода персистентности, невозможно быть окончательным). Попробуйте и посмотрите, что получится.

Очевидно, что это выходит за рамки спецификации JPA, поэтому, если вас беспокоит переносимость, подумайте сначала

1 голос
/ 21 февраля 2011

Вы можете добавить @OneToOne (targetEntity = SuperClassOfT.class) к вашим полям, чтобы эта работа работала.

Извлечение Как реализовать полиморфные сущности JPA с общими отношениями

...