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

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

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

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

             ...
             }

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

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

8
задан Pascal Thivent 11 May 2010 в 05:43
поделиться

2 ответа

Моя проблема в том, что Eclipse показывает ошибку в файле OneToOne «Целевая сущность« T », поскольку предыдущая не является сущностью».

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

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

8
ответ дан 5 December 2019 в 15:20
поделиться

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

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

2
ответ дан 5 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: