Как обрабатывать аннотации JPA для указателя на универсальный интерфейс

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

@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 ответа

Решение

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

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

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

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

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

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

Узнайте, как реализовать полиморфные сущности JPA с родовыми отношениями.

Другие вопросы по тегам