Может ли DataNucleus сохранить абстрактный базовый класс, параметризованный с помощью Generics?

Используя 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>

Хотя я не мог найти помощь в другом месте, вопрос можно было задать раньше. В этом случае краткий указатель был бы очень признателен.


person Felix Lechner    schedule 25.07.2012    source источник
comment
Приведенный вами пример JPA отличается от того, что вы пытаетесь сделать. Обратите внимание, что абстрактный класс AbstractEntity не объявляет поле ID. Это остается за реализацией подклассов.   -  person JamesB    schedule 26.07.2012
comment
@JamesB: Спасибо. Ваш ответ был объяснением, которое я искал.   -  person Felix Lechner    schedule 26.07.2012


Ответы (1)


Вы имеете в виду, определяет ли JDO, что реализация должна поддерживать это? Ответ: нет. JDO определяет допустимые типы PK, а что такое «P»? это Object в том, что касается класса (т.е. (java.lang.) Object, поскольку там нет реального типа). JPA также не определяет его в этом отношении.

person DataNucleus    schedule 26.07.2012
comment
Я просто новичок, пытающийся узнать о настойчивости. Я расценю ваш ответ как «да» на мой вопрос о стирании типа. Спасибо. Если вы участвуете в проекте @DataNucleus, спасибо вам также за эту прекрасную платформу сохранения и за вашу готовность отвечать на вопросы о ней. Это пугающий диалог (репутация 6 против репутации 7130). - person Felix Lechner; 26.07.2012