У меня есть универсальный класс, который является также отображенным суперклассом, который имеет частное поле, которое содержит указатель на другой объект того же типа:
@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 должен быть достаточно умен знать, что это будет все тренироваться во времени выполнения. Заставляет меня задаться вопросом, должен ли я просто проигнорировать эту ошибку так или иначе.
Моя проблема в том, что Eclipse показывает ошибку в файле OneToOne «Целевая сущность« T », поскольку предыдущая не является сущностью».
Да, и даже если T
расширял Entity
, я не знаю ни одного поставщика JPA, поддерживающего это (это просто не является частью спецификации JPA) . Для получения дополнительных отзывов см. JPA Классы общих сущностей Mappedsuperclass невозможны! (очень похожая ветка про EclipseLink):
Нет, вы не сможете сделать Entities универсальными. Провайдер не сможет сопоставить связь с конкретным типом, определенным универсальным определением, поскольку этот тип назначается, когда сущность создается в коде, а не там, где определена сущность. Помните, что при назначении Generics Collection (в данном случае) ограничивается только этими типами. Провайдер не может иметь такое ограничение для каждого экземпляра сущности. В некоторых случаях изменение типа может привести к отображению совершенно разных таблиц для одного экземпляра Entity, что определенно не поддерживается.
Поскольку JDO поддерживает сохранение полей интерфейса (концепция аналогична той, что у вас здесь), и поскольку DataNucleus JPA создается помимо возможностей JDO, то это, вероятно, позволит вам сохранить такое поле (у меня есть пример с использованием JDO, который делает что-то очень похожее, но не видя остатков ваших классов и кода постоянства, невозможно быть окончательным). Попробуйте и посмотрите, что произойдет.
Очевидно, что это выходит за рамки спецификации JPA, поэтому, если вас беспокоит переносимость, сначала подумайте