Используя DataNucleus, я был счастлив использовать абстрактный базовый класс для предоставления «длинного» идентификатора подклассам (обратите внимание на примитивный тип).
При адаптации примера из JPA мне пришла в голову идея параметризовать базовый класс. Цель состояла в том, чтобы поддерживать различные типы идентификаторов, такие как String.
@PersistenceCapable
@Inheritance(strategy=InheritanceStrategy.SUBCLASS_TABLE)
@Version(strategy=VersionStrategy.VERSION_NUMBER, column="jdo_version")
public abstract class VersionedIdEntity<P>
implements Serializable {
static final long serialVersionUID = 1L;
@PrimaryKey
@Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT)
private P id;
public P getId() {
return id;
}
}
Дженерики заставили меня использовать обернутый тип Java «Long», поэтому подклассы были объявлены следующим образом:
public class Account extends VersionedIdEntity<Long>
Мое переключение на новый базовый класс вызвало ошибку о том, что реализация для 'java.lang.Object' не найдена.
org.datanucleus.exceptions.NucleusUserException: поле «VersionedIdEntity.id» объявлено как ссылочный тип (интерфейс/объект), но классы реализации «java.lang.Object» не найдены!
Ошибка связана со стиранием типа?
Дополнительные вопросы: (1) как с этим справляется JPA и (2) могу ли я ограничить тип P до типы, сохраняемые в DataNucleus, например:
<? extends PersistableType>
Хотя я не мог найти помощь в другом месте, вопрос можно было задать раньше. В этом случае краткий указатель был бы очень признателен.