Java DataNucleus能否持久化使用泛型参数化的抽象基类?

Java DataNucleus能否持久化使用泛型参数化的抽象基类?,java,generics,jdo,datanucleus,type-erasure,Java,Generics,Jdo,Datanucleus,Type Erasure,使用DataNucleus,我很高兴使用抽象基类为子类提供“long”ID(请注意原语类型) 在修改一个新的类时,我想到了将基类参数化。其目的是支持不同的ID类型,例如字符串 @PersistenceCapable @Inheritance(strategy=InheritanceStrategy.SUBCLASS_TABLE) @Version(strategy=VersionStrategy.VERSION_NUMBER, column="jdo_version") public abstr

使用DataNucleus,我很高兴使用抽象基类为子类提供“long”ID(请注意原语类型)

在修改一个新的类时,我想到了将基类参数化。其目的是支持不同的ID类型,例如字符串

@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;
  }
}
@PersistenceCapable
@继承(策略=继承祖先策略。子类_表)
@版本(strategy=VersionStrategy.Version\u编号,column=“jdo\u Version”)
公共抽象类VersionedIdEntity

实现可序列化{ 静态最终长SerialVersionId=1L; @主键 @持久性(valueStrategy=IdGeneratorStrategy.INCREMENT) 私人身份证; 公共P getId(){ 返回id; } }

泛型让我使用包装的Java类型“Long”,因此子类声明如下:

public class Account extends VersionedIdEntity<Long>
公共类帐户扩展了VersionedIdEntity
我切换到新基类时出错,指出找不到“java.lang.Object”的实现

org.datanucleus.exceptions.nucleuserexception:字段“VersionedIdEntity.id”声明为引用类型(接口/对象),但未找到“java.lang.Object”的实现类

错误是否与类型擦除有关

另外的问题是(1)JPA如何处理它,以及(2)我是否可以将类型p限制为,例如:

<? extends PersistableType>

您的意思是JDO是否定义了一个实现应该支持这一点?回答:没有。

JDO定义了有效的PK类型,什么是“P”?就类而言,它是对象(即(java.lang.)对象,因为它没有真正的类型)。JPA也没有为此定义它。

您列出的JPA示例与您尝试做的不同。请注意,抽象类AbstractEntity没有声明ID字段。这就留给实现子类了。@JamesB:谢谢。你的答案正是我想要的解释。我只是一个试图学习持久性的新手。我认为你的回答是肯定的,因为我的问题是关于类型擦除。非常感谢。如果您参与了@DataNucleus项目,也要感谢您提供了出色的持久性平台,以及您可以回答有关它的问题。这是一个令人生畏的对话(声望6对7130)。